【发布时间】:2018-01-21 10:16:30
【问题描述】:
如何防止在以下代码中从 firebase 加载数据之前调用完成处理程序?
我的问题:
在将任何用户附加到用户数组之前调用完成。只有在users 实际附加了用户之后,我如何才能调用completion?
我必须使用 Grand Central Dispatch 吗?
如果您能像我 5 岁一样向我解释这一点,则可以加分。老了,所以我可以停止面对这个问题。
class func fetchFavorites(userId: String, completion: @escaping ([User]) -> Swift.Void) {
let userRef = Database.database().reference().child("users")
let favRef = Database.database().reference().child("favorites").child(userId)
favRef.observe(.value) { snap in
var users: [User] = []
for item in snap.children.allObjects as! [DataSnapshot] {
userRef.child(item.key).observeSingleEvent(of: .value) { snapshot in
if let dictionary = snapshot.value as? [String:Any] {
let newUser = User(dictionary: dictionary)
users.append(newUser)
}
}
}
completion(users)
}
}
【问题讨论】:
-
您的
completion()以异步方式在favRef.observe(.value){}上被调用,没关系,但userRef.child(item.key).observeSingleEvent(of: .value){}也是异步的,这是您的问题。 -
感谢您的回复,但我不确定我是否关注。你能在代码中澄清一下吗?
标签: swift firebase-realtime-database grand-central-dispatch