思い立ったが吉日!

iOSが好きです。

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
}];