gpt4 book ai didi

swift - 调度队列异步调用

转载 作者:行者123 更新时间:2023-11-28 05:40:19 27 4
gpt4 key购买 nike

我正在另一个网络请求中的 for 循环内触发网络请求。我正在使用核心数据,但我相当确定这不是核心数据问题,而是异步问题。

Firebase 请求中的 2 个打印语句正确打印数据,但没有 DispatchQueue,数组返回为空(在网络请求完成之前)。

这是崩溃的图片: Crash

这是代码本身:

var userReps = [UserRepresentation]()

// Fetch all Friends -> update Core Data accordingly
func fetchFriendsFromServer(completion: @escaping (Error?) -> Void = { _ in}){
let backgroundContext = CoreDataStack.shared.container.newBackgroundContext()

// 1. Fetch all friends from Firebase
FirebaseDatabase.UserDatabaseReference.child(CoreUserController.shared.userPhoneNumber).child(UserKeys.UserFriends).child(UserKeys.UserAcceptedFriends).observe(.value) { (data) in
if let dictionary = data.value as? [String: String] {
var userReps = [UserRepresentation]()
let group = DispatchGroup()

group.enter()
for friend in dictionary {
let friendName = friend.value
let friendId = friend.key

FirebaseDatabase.UserDatabaseReference.child(friendId).observe(.value, with: { (data) in
if let dictionary = data.value as? [String: Any] {
guard let gender = dictionary[UserKeys.UserGender] as? String else {return}
guard let bio = dictionary[UserKeys.UserBio] as? String else {return}
guard let status = dictionary[UserKeys.UserStatus] as? String else {return}
guard let avatarUrl = dictionary[UserKeys.UserAvatarUrlKey] as? String else {return}

let friendRepresentation = UserRepresentation(avatarUrl: avatarUrl, name: friendName, number: friendId, gender: gender, status: status, bio: bio)
userReps.append(friendRepresentation)
print("HERE, friends fetched: ", friendRepresentation)
print("HERE, reps fetched: ", userReps)
group.leave()
}
})
}

group.notify(queue: .main) {
// 2. Update Core Data value with Firebase values
self.updateFriends(with: userReps, in: backgroundContext)

// 3. Save Core Data background context
do {
try CoreDataStack.shared.save(context: backgroundContext)
} catch let error {
print("HERE. Error saving changes to core data: \(error.localizedDescription)")
}
}
}
}
}

任何帮助都会有很长的路要走

最佳答案

let group = DispatchGroup()

是一个局部变量,你在这里使用 observe

FirebaseDatabase.UserDatabaseReference.child(friendId).observe(.value, with: { (data) in

它将在函数解除分配后重新调用它,要么将其设为实例变量,要么将其设为单个观察

 FirebaseDatabase.UserDatabaseReference.child(friendId).observeSingleEvent(of:.value) { (data) in

同样在for循环中进行enter

for friend in dictionary {  
group.enter()

关于swift - 调度队列异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998660/

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