方法参数块背后的逻辑
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
不会被记录吗?这是否阐明了块中参数的使用?
我不太理解这是如何工作的。我目前正在使用同步 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
不会被记录吗?这是否阐明了块中参数的使用?