Ios 多个完井区块
我遵循本教程: 但是我不理解这段代码,因为它有多个完成处理程序,我也不理解这段代码是如何工作的(我知道这是singleton类的一部分,但是这段代码在做什么,以及什么是“notes?”.notes?”: 我已经连续8天被困在这一点上了,所以请帮助我:(listNotes(:)有自己的完成块,名为completion 在listNotes(:)的完成体中,listNotes(:)对名为list(:,:)的客户端变量调用异步抛出函数 函数列表(:,:)有自己的完成块,并向其中传递两个变量:notes和result 当list(:,:)的完成块执行时,首先会创建一个GCD块,在主线程上执行listNotes(:)的完成 然后它将两个块变量从列表(:,:)的闭包向前传递到listNotes(:)的闭包中;可选变量notes上的一个属性也命名为notes(应该在imo中重构)和result 这里需要注意的一件非常重要的事情是,因为client.list(:,:)是一个抛出函数,并且永远不会捕获错误,如果该函数确实抛出,则listNotes(:)永远不会执行它的完成块。我通常认为这是非常糟糕的实践,因为有人可以依赖于该函数来执行它的闭包而不管成功。你基本上是在破坏你在函数签名中做出的承诺。Ios 多个完井区块,ios,swift,protocol-buffers,grpc,Ios,Swift,Protocol Buffers,Grpc,我遵循本教程: 但是我不理解这段代码,因为它有多个完成处理程序,我也不理解这段代码是如何工作的(我知道这是singleton类的一部分,但是这段代码在做什么,以及什么是“notes?”.notes?”: 我已经连续8天被困在这一点上了,所以请帮助我:(listNotes(:)有自己的完成块,名为completion 在listNotes(:)的完成体中,listNotes(:)对名为list(:,:)的客户端变量调用异步抛出函数 函数列表(:,:)有自己的完成块,并向其中传递两个变量:note
ListNoX(^:)有它自己的完成块名为完成。 在listNotes(:)的完成体中,listNotes(:)对名为list(:,:)的客户端变量调用异步抛出函数
函数列表(:,:)有自己的完成块,并向其中传递两个变量:notes和result 当list(:,:)的完成块执行时,首先会创建一个GCD块,在主线程上执行listNotes(:)的完成 然后它将两个块变量从列表(:,:)的闭包向前传递到listNotes(:)的闭包中;可选变量notes上的一个属性也命名为notes(应该在imo中重构)和result这里需要注意的一件非常重要的事情是,因为client.list(:,:)是一个抛出函数,并且永远不会捕获错误,如果该函数确实抛出,则listNotes(:)永远不会执行它的完成块。我通常认为这是一个非常糟糕的实践,因为有人可以依赖这个函数来执行它的关闭,不管它是否成功。你本质上是在破坏你在函数签名中做出的承诺。最后一段很重要。我总是确保完成。不管发生什么,处理程序都会被调用。其他任何事情都会导致灾难。最后一段非常重要。我始终确保无论发生什么,都会调用完成处理程序。其他任何事情都会导致灾难。
func listNotes(completion: @escaping([Note]?, CallResult?) -> Void) {
_ = try? client.list(Empty(), completion: { (notes, result) in
DispatchQueue.main.async {
completion(notes?.notes, result)
}
})
}