我自己的方法的自定义完成块

时间:2013-05-01 18:30:15

标签: objective-c objective-c-blocks

我刚刚发现了完成块:

 completion:^(BOOL finished){


                     }];

我需要做什么才能让我自己的方法采用完成块?

3 个答案:

答案 0 :(得分:225)

1)定义您自己的完成块,

typedef void(^myCompletion)(BOOL);

2)创建一个将完成块作为参数

的方法
-(void) myMethod:(myCompletion) compblock{
    //do stuff
    compblock(YES);
}

3)这是您使用它的方式,

[self myMethod:^(BOOL finished) {
    if(finished){
        NSLog(@"success");
    }
}];

enter image description here

答案 1 :(得分:24)

您可以将块定义为自定义类型:

typedef void (^ButtonCompletionBlock)(int buttonIndex);

然后将其用作方法的参数:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
                          cancelAction:(ButtonCompletionBlock)cancelBlock
                      completionAction:(ButtonCompletionBlock)completionBlock

在代码中调用它时,它就像任何其他块一样:

[SomeButtonView buttonViewWithTitle:@"Title"
                       cancelAction:^(int buttonIndex) {
                             NSLog(@"User cancelled");
                   } 
                     completionAction:^(int buttonIndex) {
                             NSLog(@"User tapped index %i", buttonIndex);
                   }];

如果到了触发阻止的时间,只需调用completionBlock()(其中completionBlock是阻止本地副本的名称。)

答案 2 :(得分:2)

块变量的语法与C中的函数指针类似。

因为语法很难看,所以它们通常是typedefed,但它们也可以正常声明。

typedef void (^MyFunc)(BOOL finished);

- (void)myMethod:(MyFunc)func
{
}

请参阅非typedef的答案:

Declare a block method parameter without using a typedef