多个完成区块

时间:2019-05-06 14:33:41

标签: ios swift protocol-buffers grpc

我正在关注本教程:

https://medium.com/swift2go/building-grpc-client-ios-swift-note-taking-app-6133c7d74644

但是我不理解这段代码,因为它具有多个完成处理程序,而且我也不理解这段代码的工作方式(我知道这是单例类的一部分,但是这段代码在做什么,“ notes..notes”是什么? ???:

func listNotes(completion: @escaping([Note]?, CallResult?) -> Void) {
    _ = try? client.list(Empty(), completion: { (notes, result) in
        DispatchQueue.main.async {
            completion(notes?.notes, result)
        }
    })
}

从现在开始,我连续8天陷入困境,所以请帮助我:(

1 个答案:

答案 0 :(得分:2)

listNotes(_ :)有其自己的完成块,称为完成。

在listNotes(_ :)完成的主体中,listNotes(_ :)在名为list(_ :, _ :)的客户端变量上调用异步抛出函数。

函数列表(_ :, _ :)有自己的完成块,并将两个变量传递给它;笔记和结果。

当list(_ :, _ :)的完成块执行时,首先发生的是它创建了一个GCD块来在主线程上执行listNotes(_ :)的完成。

然后将两个块变量从list(_ :, _ :)的闭包传递到listNotes(_ :)的闭包;可选变量notes上的一个属性,也称为notes(应重构为imo)和result。

这里要注意的一个非常重要的事情是,因为client.list(_ :, _ :)是一个抛出函数,并且永远不会捕获错误,如果该函数确实抛出了,则listNotes(_ :)将永远不会执行其完成块。我一般认为这是非常不好的做法,因为有人可能会依赖该函数执行关闭操作,而不管其成功与否。您实质上是在设置自己,以破坏您在函数签名中做出的承诺。