2017-10-17 125 views
0

我想一個全局變量從alamofire變量中改變內改變,但我有問題這樣做。這裏是我的代碼:無法全局變量從功能

var projects = [[String]]() 
var xmlToParse = String() 
var postTitle = String() 
var postLink = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    httpRequest("https://www.hello.com/feed") { response in 
     self.xmlToParse = response as String 
     let xml = SWXMLHash.parse(self.xmlToParse) 

     for elem in xml["rss"]["channel"]["item"].all { 
      self.postTitle = elem["title"].element!.text 
      self.postLink = elem["link"].element!.text     
      self.projects.append([self.postTitle, self.postLink]) 
     } 
    } 
    print(self.projects) 
} 

當我在這裏打self.projects,我得到一個空數組,但是當我打印出來的HttpRequest的功能我得到正確的數據內。我是不是在for循環中設置全局變量項目?我怎樣才能獲得該功能以外的價值?我嘗試了所有我發現的一切,但沒有成功。任何幫助是極大的讚賞。

只是爲了更多的信息,這裏是我的HttpRequest功能:

func httpRequest(_ section: String, completion: @escaping (String) -> Void) { 
    Alamofire.request(section, method: .get).responseString { response in 
     completion(response.result.value!) 
    } 
} 
+2

這是因爲即使在httpRequest函數調用完成處理程序之前您正在打印self.projects。 – koropok

+0

嗯..那麼我怎樣才能得到它,這樣的項目數組可以訪問ViewDidLoad中的適當的數據,以及在其他功能? –

+0

爲什麼不把你的邏輯放在完成處理程序中? – koropok

回答

1

假設XML [ 「RSS」] [ 「通道」] [ 「項目」]不是零...

override func viewDidLoad() { 
    super.viewDidLoad() 

    httpRequest("https://www.hello.com/feed") { response in 
     self.xmlToParse = response as String 
     let xml = SWXMLHash.parse(self.xmlToParse) 

     for elem in xml["rss"]["channel"]["item"].all { 
      self.postTitle = elem["title"].element!.text 
      self.postLink = elem["link"].element!.text     
      self.projects.append([self.postTitle, self.postLink]) 
     } 

     self.setup() 
    } 
} 

func setup() { 
    // Your logic here 
} 
+0

感謝這個可能的重複。我很困惑安裝過程中發生了什麼。原始函數httpRequest? –

+0

另外,我正在做的下一件事情將是無錯誤處理:) –

+0

您可以將代碼放在您計劃在setup中使用self.projects執行的操作。通過這樣做,您可以確保self.projects變量已被賦值爲某個值。 – koropok