我编写并使用了一个小小的完成处理程序来练习钉住块 -
grep -o "[a-zA-Z]\+," file
在其他地方的VC中,我检查完成变量;如果块已完成,我将背景颜色更改为其他颜色。
我的问题是这个 - 在方法-(void)delayAndSetCompletionBlock:(void (^)(BOOL))completed {
//set a delay timer
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//code to be executed on the main queue after delay
completed(YES);
});
}
中,我们有一个块是一个参数。该块的返回类型为void,将delayAndSetCompletionBlock
作为参数,BLOCK参数称为completed。这与我所说的Bool
?
我只是对completed(YES)
与我作为方法参数传递的块有什么关系感到困惑。 completed(YES)
是传递给方法的块类型的名称,所以我说“执行我们给出方法的块,并将completed
作为布尔参数传递”?如果是这样,该块如何知道如何处理YES
?
答案 0 :(得分:0)
您使用名为completed
的单个参数声明了一个方法。这个参数是一个块,返回void
并期望单个BOOL
参数,在你的情况下是未命名的。
您可以为清除提供块参数名称,尽管它没有在代码中使用。此外,您可以重命名块以避免混淆:
-(void)delayAndSetCompletionBlock:(void (^)(BOOL completed))completionBlock;
所以,你的猜测
所以我说"执行我们给出方法的块,然后通过 是的,因为布尔参数是"?
是对的。
如果是这样,该块怎么知道如何处理"是"?
您的方法的调用者通常会提供块实现。例如:
[self delayAndSetCompletionBlock:^void (BOOL completed) {
if (completed) {
NSLog(@"done!");
}
}];
他会对你的方法有什么期望。如果你的方法是公开的,希望你会记录它,并指定何时调用completionBlock
,以及block参数的含义是什么。也许,你至少会在头文件中提供评论。此外,代码可以自行记录,因此任何具有Objective-C经验的开发人员都会期望类似的行为并阻止参数的含义。