了解自定义完成处理程序

时间:2016-02-17 00:53:09

标签: objective-c callback objective-c-blocks completionhandler

我编写并使用了一个小小的完成处理程序来练习钉住块 -

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

1 个答案:

答案 0 :(得分:0)

您使用名为completed的单个参数声明了一个方法。这个参数是一个块,返回void并期望单个BOOL参数,在你的情况下是未命名的。

您可以为清除提供块参数名称,尽管它没有在代码中使用。此外,您可以重命名块以避免混淆:

-(void)delayAndSetCompletionBlock:(void (^)(BOOL completed))completionBlock;

所以,你的猜测

  

所以我说"执行我们给出方法的块,然后通过   是的,因为布尔参数是"?

是对的。

  

如果是这样,该块怎么知道如何处理"是"?

您的方法的调用者通常会提供块实现。例如:

[self delayAndSetCompletionBlock:^void (BOOL completed) {
    if (completed) {
        NSLog(@"done!");
    }
}];

他会对你的方法有什么期望。如果你的方法是公开的,希望你会记录它,并指定何时调用completionBlock,以及block参数的含义是什么。也许,你至少会在头文件中提供评论。此外,代码可以自行记录,因此任何具有Objective-C经验的开发人员都会期望类似的行为并阻止参数的含义。