完了ブロックを発見しました:
completion:^(BOOL finished){
}];
自分のメソッドに完了ブロックを取得させるにはどうすればよいですか?
1)独自の完了ブロックを定義、
typedef void(^myCompletion)(BOOL);
2)完了ブロックをパラメーターとして取るメソッドを作成します、
-(void) myMethod:(myCompletion) compblock{
//do stuff
compblock(YES);
}
3)これがあなたの使い方です、
[self myMethod:^(BOOL finished) {
if(finished){
NSLog(@"success");
}
}];
ブロックをカスタムタイプとして定義します。
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
はブロックのローカルコピーの名前です)を呼び出すだけです。
ブロック変数の構文は、Cの関数ポインターに似ています。
構文がugいため、多くの場合型定義されていますが、通常どおり宣言することもできます。
typedef void (^MyFunc)(BOOL finished);
- (void)myMethod:(MyFunc)func
{
}
Typedefについては、この回答を参照してください。