swift - 如何防止 Swift 3 中的嵌套完成 block ?

标签 swift nested completionhandler

我在下面提供的代码中有一系列嵌套的完成 block 。这是因为我需要在后台发出单独的网络请求来抽象数据,以便在下一个方法中使用,它提供了另一个完成 block ,等等。有没有办法解决?非常感谢任何提示!

func fetchNearbyUsers(forCurrentUser user: User, completionHandler: usersCompletionHandler?) {

    self.fetchAllUsers(completionHandler: { (users: [User]) in

        ChatProvider.sharedInstance.fetchAllChatrooms(completionHandler: { (chatrooms: [Chatroom]) in

            self.validateNewUsers(currentUser: user, users: users, chatrooms: chatrooms, completionHandler: { (validUsers: [User]) in

                guard validUsers.isEmpty == false else {
                    completionHandler?([])
                    return
                }
                completionHandler?(validUsers)
            })
        })
    })
} 

最佳答案

这里的一个选择是使用高阶工厂函数(即返回其他函数的函数)将 block 分解为它们自己的函数...

func fetchNearbyUsers(forCurrentUser user: User, completionHandler: @escaping usersCompletionHandler = { _ in }) {      
    self.fetchAllUsers(completionHandler: self.allUsersFromChatrooms(user: user, completionHandler: completionHandler))
}

func allUsersFromChatrooms(user: User, completionHandler: @escaping usersCompletionHandler) -> ([User]) -> Void {
    return { users in
        ChatProvider.sharedInstance.fetchAllChatrooms(completionHandler: self.validatedUsersInChatrooms(user: user, users: users, completionHandler: completionHandler))
    }
}

func validatedUsersInChatrooms(user: User, users: [User], completionHandler: @escaping usersCompletionHandler) -> ([Chatroom]) -> Void {
    return { chatrooms in
        self.validateNewUsers(currentUser: user, users: users, chatrooms: chatrooms, completionHandler: completionHandler)
    }
}

在上面的代码中,validatedUsersInChatrooms 将返回一个函数,该函数接受聊天室数组并调用提供的已验证用户的完成处理程序。函数 allUsersFromChatrooms 返回一个函数,该函数接受一组用户,然后获取聊天室并使用来自聊天室的一组经过验证的用户调用提供的完成处理程序。

另请注意,我更改了您的 fetchNearbyUsers 函数以接受完成 block 并默认为不执行任何操作的 block ,而不是使用可选 block 。我感觉干净多了。

关于swift - 如何防止 Swift 3 中的嵌套完成 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44301447/

相关文章:

ios - 不断增长的文本输入 View - swift 示例

ios - Swift2.0 HTTP 请求不工作

ios - Swift 单元测试从闭包内部抛出函数

JQuery:获取不包括嵌套标签的标签内容

mysql嵌套查询的最大值

ios - 获取传递给完成处理程序以进行单元测试的值

swift - viewDidLoad 中的异步任务

swift - 用异步方法关闭(Swift 2.0)

swift - 嵌套完成处理程序不返回要发送到 TableViewController 的项目

python - 在 Python 中打印表格