我正在使用Firestore创建一个应用程序,我有一个功能可以将用户添加到另一个用户的朋友列表中,如果成功完成,则返回true。 这是功能:
static func addFriendToList(_ id: String) -> Bool {
var friend: Friend!
var isSuccessfullyAddedFriend: Bool = false
let group = DispatchGroup()
DispatchQueue.global(qos: .userInitiated).async {
group.enter()
// Getting user's deatils and creating a Friend object.
FirestoreService.shared.getUserDetailsById(user: id) { (newFriend) in
if newFriend != nil {
friend = newFriend!
}
group.leave()
}
group.wait()
group.enter()
// Adding the new Friend Object to the friends list of the current user
FirestoreService.shared.addUserToFriendsList(friend: friend) { (friendAdded) in
if friendAdded {
isSuccessfullyAddedFriend = true
FirestoreService.shared.fetchFriendList()
}
}
group.leave()
}
group.wait()
return isSuccessfullyAddedFriend
}
我的问题是addUserToFriendsList
是一个异步函数,并且在return
isSuccessfullyAddedFriend
转到true
之前正在执行。
如您所见,我试图通过使用DispatchGroup来克服此问题,但没有成功,仍然会出现问题。还有另一种也许更好的方法来实现这一目标吗?
我需要在return
之后出现addUserToFriendsList
行
答案 0 :(得分:1)
您需要
static func addFriendToList(_ id: String,completion:@escaping(Bool)->()) {
FirestoreService.shared.getUserDetailsById(user: id) { (newFriend) in
FirestoreService.shared.addUserToFriendsList(friend: newFriend) { (friendAdded) in
if friendAdded {
FirestoreService.shared.fetchFriendList()
completion(true)
}
else {
completion(false)
}
}
}
}
致电
Api.addFriendToList(<#id#>) { flag in
print(flag)
}
2个笔记
1- Firebase调用在后台线程中运行,因此不需要全局队列
2- DispatchGroup用于多个非串行的并发任务