异步函数返回正常,但数组变空

时间:2016-03-27 02:28:53

标签: ios arrays swift asynchronous

我刚刚在之前发布的一个问题中了解了异步函数,我需要合并另一个。我正在阅读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这个也不起作用,所以我真的迷失了。

1 个答案:

答案 0 :(得分:1)

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