我有点难以理解它是如何工作的。我目前正在使用一个同步表,它使用如下调用:
-(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/