确保异步功能后执行代码块

时间:2019-10-20 20:56:57

标签: swift asynchronous

我正在使用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

1 个答案:

答案 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用于多个非串行的并发任务