我刚刚在之前发布的一个问题中了解了异步函数,我需要合并另一个。我正在阅读Firebase中的条目列表,返回它们的列表,并将它们分配给数组。
现在的问题是,当我将数组返回给调用函数时,数组现在是空的,我不知道为什么。
这就是我收集Firebase条目的方式(工作正常):
func getListItems(uid: String, completion: (list: Array<String>?) -> Void) {
let ref = Firebase(url: getFirebaseURL() + "/" + uid)
var taskList = [String]()
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FDataSnapshot {
taskList.append(rest.value as! String)
}
completion(list: taskList)
})
}
这就是我调用该函数并尝试将其分配给本地数组的方法,因此我可以将这些项添加到TableView中:
// Retrieve database items
let uid = def.valueForKey("uid") as! String
getListItems(uid) {
(result) in
self.taskListItems = result!
//print(result) // This prints out an array filled with my data
}
print(taskListItems) // This prints an empty array
如果我做print(result)
它会吐出一个完美的数组,但是当我打印我尝试使用的本地数组时却没有。我已将taskListItems
定义为:var taskListItems = [String]()
我也尝试过使用.append
这个也不起作用,所以我真的迷失了。
答案 0 :(得分:1)
原因是你的print(taskListItems)
行在print(result)
之前调用。这是因为HTTP请求是异步的,并且在块完成后(在调用print(taskListItems)
之后)执行块内的代码。你应该做的是让你的代码在块中使用结果。