方法参数块背后的逻辑

logic behind blocks in method parameter

我不太理解这是如何工作的。我目前正在使用同步 table,它使用如下调用:

-(void)addItem:(NSDictionary *)item completion:(CompletionBlock)completion{
[self.syncTable insert:item completion:^(NSDictionary *result, NSError *error) {
    [self LogErrorIfNotNil:error];


}];

我了解如何使用块作为参数在函数中执行一些额外的代码,例如 dispatch_async。 但是说到这一行

[self.syncTable insert:item completion:^(NSDictionary *result, NSError *error) {

这里的结果是一个字典,其中包含在 "item" 之后添加到 table 之后的所有额外列。仔细想想,似乎 "result" 更像是 addItem: 的结果类型,而不是方法的参数(由于是执行方法的结果)

编辑:基本上,我不明白 NSDictionary *result 变量的来源。对我来说,它似乎应该是 return 类型的 addItem:item

这里解释了上述块的工作原理和顺序。

完成并不是真正的 return 值,也许这就是让您感到困惑的原因。完成块是一种将代码发送到方法的方法,该方法可以 运行 在该方法的范围内。

所以当您将一个块发送到一个方法时,这是一个可能的事件顺序...

- (void)addItem:(NSDictionary *)item completion:(CompletionBlock)completion {
    NSLog(@"1");
    [self.syncTable insert:item 
                completion:^(NSDictionary *result, NSError *error) {
                    NSLog(@"2");
                }
    ];
    NSLog(@"3"); 
}

// SyncTable.m?
- (void)insert:(NSDictionary *)item completion:(CompletionBlock)completion {
    NSLog(@"4");
    NSDictionary *result = ...;  // Prepare the result dictionary to be used in the completion block.
    NSError *error = nil
    completion(result, &error);
}

这些日志的输出顺序如下...

1
3
4
2

注意到在 insert:completion: 中调用完成块之前,2 不会被记录吗?这是否阐明了块中参数的使用?