【发布时间】:2019-07-22 07:05:59
【问题描述】:
我正在尝试编写一个函数来从 firebase 获取数据并更新一个全局变量(分支),我知道后台线程对此负责,因此即使后台线程尚未完成,主线程也可以继续,但我不想那样。如何强制主线程等到全局变量更新?
这里是函数:
func getID(email: String){
databaseRef = Database.database().reference()
databaseRef.root.child("Branches").observe(.value, with: { (snapshot) in
if ((snapshot.children.allObjects as? [DataSnapshot]) != nil) {
let child = snapshot.value as! [String: [String : String]]
for (key, data) in child{
for (k, d) in data{
if k == "Email" && d == email {
self.branch = key
}
}
}
}
})
}
【问题讨论】:
-
为后台任务保留主线程不是一个好习惯。您可以在后台任务完成后使用转义闭包进行通知。
-
见stackoverflow.com/q/54322884、stackoverflow.com/a/49579711、stackoverflow.com/q/41628089、more from these和stackoverflow.com/a/27345823。最后一个展示了如何完成您的要求,但正如其他人已经评论和回答的那样,您最好学习如何处理异步行为,因为这在使用现代基于云的 API 时非常常见。
-
我和@FrankvanPuffelen 在一起。但是,您的问题中显示的功能可能会在不到一秒钟的时间内发生......或者可能不会。我怀疑您正在数据中寻找某些东西——也许查询会比循环更好的解决方案,因为它会返回特定的数据片段。用例是什么?
标签: swift multithreading firebase firebase-realtime-database