2017-08-04 56 views
-2

我有這個閉包,我用它來填充我的數組和字典。但是,當我嘗試在函數外部使用它時,它是空的。這裏是我的代碼:無法在關閉Swift之外訪問數組3

var pages: [FBPages] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    Facebook.getUserInfo(greetingLabel: greetingLabel, profileImage: profilePic) 

    pages = [] 

    let params = ["fields": "about,name,created_time,picture", "limit": "3"] 
    Facebook.getUserPagesLikes(params: params, handler: { (userData) in 

     guard let pagesArrays = userData["data"] as? Array<Any> else {return} 

     for dict in pagesArrays { 

      let fbPages = FBPages() 
      let pagesData = dict as! NSDictionary 
      fbPages.about = pagesData["about"] as! String 
      fbPages.name = pagesData["name"] as! String 
      self.pages.append(fbPages) 

     } 


     print("pages array: \(pagesArrays)") 
     print("pages : \(self.pages.count)") 



    }) { (error) in 
     print("cannot get FB pages: \(String(describing: error))") 
    } 




    //I got 0 here 
    print("fb array: \(pages.count)") 

} 

我試圖在封閉外打印數組計數,但我只有0作爲結果。我怎麼解決這個問題。提前致謝。

+0

它是0,因爲getUserPagesLikes在打印之前尚未完成。 – koropok

+0

是的,我知道,那麼如何修復這段代碼,以便我可以訪問數組之外​​的閉包? – z3r0

+0

加載你的tableview/collectionview /或閉包中的任何邏輯? – koropok

回答

1

您需要了解打印數組的時間。它尚未提供。 getUserPagesLikes是一個異步調用。這是採取完成處理程序。一旦響應回來,你將在你的數組中有值。

就像你問getUserPagesLikes來獲取用戶喜歡你,你不等待用戶喜歡那裏你可以理解爲序列。你繼續前進,並且完成塊後你寫的任何代碼被調用。你的情況就是打印陣列。

一旦getUserPagesLikes回來的數據你建成塊被調用。這時你分配數組值。數組中的值僅在此之後可用。所以如果你想在表視圖中重新加載數據在完成處理程序中執行它。還要確保你在主線程上做到這一點。

對於你可以通過here在完成處理器的細節信息和他們通話的序列。

+0

謝謝你的解釋,最後我可以通過在關閉結束處添加** tableview.reloadData()**來解決這個問題,現在我的tableView按計劃工作。 – z3r0