Blocks
Objective-CのBlocksのまとめ
といっても全部まとめるとややこしいので、よく使われる関数の引数にBlocksを渡して、コールバックを受け取るという形のみに絞ってまとめます。
とわいえ基本形の復讐
^(戻り値の型)(引数リスト){式}
ところが、関数の引数になるとやや形が変わる
(戻り値の型)(^)(引数リスト)ブロック名
引数なし、戻り値なしのBlocksを引数に取るメソッド
- (void)hoge:(void(^)(void))completion { // 何か処理 // Blocksの式の部分を実行 completion(); }
// メソッドの実行
[self hoge:^{ // 式の部分 }];
Blocksに引数があるパターン
何か非同期処理をする際に、その非同期処理に対して引数を渡すことは多々ある
-(void) hogehoge:(void(^)(int,int))completion { // 何か処理A // 5秒止めてLogを出す sleep(5); completion(20,10); // 何か処理B }
// メソッドの実行
// 何か処理C [self hogehoge:^(int x, int y) { NSLog(@"%d",x); // 20 NSLog(@"%d",y); //10 }]; // 何か処理D
処理順は C -> A -> B -> D
メソッドの引数が2つ(StringとBlocks)で、そのBlocksの引数も2つ
-(void)hogehogehoge:(NSString*)str completionHandler:(void(^)(NSString* p,NSString* q))completion { NSString *strings = [str stringByAppendingString:@"world"]; NSString *ex = [strings stringByAppendingString:@"!!!!"]; completion(ex,strings); // pにexが、qにstringsが入る }
// メソッドの実行
[self hogehogehogehoge:@"hello" completionHandler:^(NSString *p, NSString *q) { NSLog(@"%@",p); // helloworld!!!! NSLog(@"%@",q); // helloworld }];