ios - 方法参数 block 背后的逻辑

标签 ios objective-c blocking

我有点难以理解它是如何工作的。我目前正在使用一个同步表,它使用如下调用:

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


}];

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

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

结果是一个字典,包括“item”添加到表后的所有额外列。仔细想想,似乎“result”更像是addItem的结果类型:而不是方法的参数(由于是执行方法的结果)

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

最佳答案

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

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

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

- (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

请注意 2 直到在 insert:completion: 中调用完成 block 时才会被记录下来?这是否阐明了 block 中参数的使用?

关于ios - 方法参数 block 背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29282031/

相关文章:

iPhone 接口(interface)尺寸

ios - 创建具有可调整大小的自定义背景的 texview

objective-c - NSURLCache 使用什么缓存算法?

python - 在 Python 中非阻塞地收集子进程输出

python - Python中的"Threading",绘制接收到的数据并同时发送

具有阻塞读取和非阻塞写入的循环/环形缓冲区?

ios - MKDirectionsResponse 对象给出空值

ios - 当分割 View Controller 的主控隐藏(纵向模式)时,核心动画停止?

ios - 检查 NSString 是否为空/空的防弹方法是什么?

objective-c - 在 Objective-C 中删除动态创建的对象时,我应该将什么设置为 nil?