我很难理解这是如何工作的。我目前正在使用同步表,该表使用如下调用:
-(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答案 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:
?这是否澄清了块中参数的使用?