【发布时间】:2016-11-09 00:44:04
【问题描述】:
我只是在 Swift 中进行黑客攻击,但对于我的生活而言,除了一个空的 [Item] 之外,我无法将其发送给 return。 [Item] 是正确的,如果我在闭包内执行 print 函数,也是我想要的方式。
func getCurrentDetails(ref: FIRDatabaseReference) -> [Item] {
ref.observeEventType(.Value, withBlock: { snapshot in
var currentDetails = [Item]()
for item in snapshot.children {
var currentItem = Item(snapshot: item as! FIRDataSnapshot)
if currentItem.Name != "" {
currentItem.Image = "http://www.deletedthisurl/" + currentItem.Number + "_500X500.gif"
currentDetails.append(currentItem)
}
}
self.currentArray = currentDetails
// print(self.currentArray) // Prints here
})
print(self.currentArray) //Prints an empty Item array here
return currentArray
}
【问题讨论】:
-
可能是并发问题。声明块与执行它不同。您的打印语句很可能在块代码运行之前发生。
-
嗯。打印出来的 self.currentArray 反映了闭包体的变化..
-
啊……我明白了。
-
一般来说,不要将 Firebase 事件视为函数。通常最好不要这样对待它们(即不要尝试返回值,因为这不是它们的用途)。例如,加载一个数组来填充一个 tableView:使用 for child in snapshot.children{} 遍历快照,然后在该 for 循环中处理每个子项 - 例如将数据添加到数组.然后当循环完成时,调用 tableView.reloadData()。将所有代码保留在块中。如果您想在填充数组数据后对其执行某些操作,请从 块内调用下一步。
标签: swift firebase closures firebase-realtime-database