我刚刚在一个较早发布的问题中了解了异步功能,因此需要合并另一个功能。我正在从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也不起作用,因此我对发生的事情真的迷失了。

最佳答案

原因是在块中的print(taskListItems)之前调用print(result)的行。这是因为HTTP请求是异步的,并且在完成后(即在调用print(taskListItems)之后)在块内执行代码。您应该做的就是在块中使用代码来使用结果。

关于ios - 异步函数返回正常,但数组为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36243205/

10-09 18:22
查看更多