方法参数中块后面的逻辑

时间:2015-03-26 15:09:36

标签: ios objective-c blocking

我很难理解这是如何工作的。我目前正在使用同步表,该表使用如下调用:

-(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"之后的所有额外列。已被添加到表中。想一想,似乎"结果"更像是addItem的结果类型:而不是方法的参数(由于是执行方法的结果)

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

1 个答案:

答案 0 :(得分:1)

以下是对上述块如何工作以及按什么顺序的说明。

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

因此,当您向方法发送块时,这可能是事件的顺序......

- (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:?这是否澄清了块中参数的使用?