gpt4 book ai didi

swift - 在数据加载之前调用的完成处理程序

转载 作者:行者123 更新时间:2023-11-28 12:11:32 31 4
gpt4 key购买 nike

如何在以下代码中从 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)
}
}

最佳答案

您有两个嵌套的异步函数,即 favRef.observeuserRef.child().observeSingleEvent(of:),因此问题是 completion 在更新用户的所有异步调用可以完成执行之前在外部闭包中调用。

您可以通过使用 DispatchGroup 并在所有异步方法调用在循环中完成执行后仅调用 completion 来解决此问题。这可以通过将所有异步调用添加到 DispatchGroup,然后在 group.notify 调用中调用 completion 来实现。

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)
let usersGroup = DispatchGroup()

favRef.observe(.value) { snap in
var users: [User] = []
for item in snap.children.allObjects as! [DataSnapshot] {
usersGroup.enter()
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)
}
usersGroup.leave()
}
}
usersGroup.notify(queue: DispatchQueue.global()){
completion(users)
}
}
}

关于swift - 在数据加载之前调用的完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48365742/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com