我有这个闭包,我用来填充我的数组和字典。但是,当我尝试在函数外部使用它时,它是空的。这是我的代码:
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 :(得分:1)
您需要了解打印阵列的时间。它还没有。 getUserPagesLikes
是异步调用。这是一个完成处理程序。一旦响应返回,您将在阵列中拥有值。
您可以理解序列,就像您要求getUserPagesLikes
为您提取用户喜欢的那样,并且您不会在那里等待用户喜欢。你继续前进,完成块后你写的任何代码都会被调用。在你的情况下,这是打印阵列。
一旦getUserPagesLikes
为您获取数据,就会调用其完成块。此时您将分配数组值。数组中的值仅在此之后可用。因此,如果要在表视图中重新加载数据,请在完成处理程序中执行此操作。还要确保在主线程上执行此操作。
有关完成处理程序及其调用顺序的详细信息,您可以查看here。