web-dev-qa-db-ja.com

自分のメソッドのカスタム完了ブロック

完了ブロックを発見しました:

 completion:^(BOOL finished){


                     }];

自分のメソッドに完了ブロックを取得させるにはどうすればよいですか?

76
user2206906

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

ブロックをカスタムタイプとして定義します。

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はブロックのローカルコピーの名前です)を呼び出すだけです。

25
jszumski

ブロック変数の構文は、Cの関数ポインターに似ています。

構文がugいため、多くの場合型定義されていますが、通常どおり宣言することもできます。

typedef void (^MyFunc)(BOOL finished);

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

Typedefについては、この回答を参照してください。

typedefを使用せずにブロックメソッドパラメーターを宣言する

2
Justin Meiners