blockを使ったコールバック

  • 1
    Like
  • 0
    Comment

Objective-cのコールバック処理に関して、普段からデリゲートばかり使っていたので、今回初めてblockを使って、コールバック処理を行ってみました。
最低限の処理しかしていないですが、備忘録として残します。

今回は、処理の完了後にコールバックでテキスト型の値を受け取り、出力しています。

必要となるhandlerの定義

OtherClass.h
typedef void (^CallbackHandler)(NSString *returnText);

@interface OtherClass : NSObject

-(void)doSomeWorkWith:(CallbackHandler)handler;

@end
OtherClass.m
#import "OtherClass.h"

@interface OtherClass ()

@end

@implementation OtherClass

-(void)doSomeWorkWith:(CallbackHandler)handler {

    // 何らかの処理を行います。

    // 処理結果を用意
    NSString *returnText = @"処理結果テキスト";

    // コールバックが指定されている場合には、それを呼び出す。
    if (handler) {
        handler(returnText);
    }
}

@end

実行結果

ボタンを押下することで”処理結果テキスト”が出力されるようにします。

ViewController.m
#import "ViewController.h"
#import "OtherClass.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)call {
    OtherClass *otherClass = [OtherClass new];

    [otherClass doSomeWorkWith:^(NSString *returnText) {

    // OtherClassのdoSomeWorkWithメソッド完了後、受け取った結果を出力
        NSLog(@"%@", returnText);
    }];
}

- (IBAction)blockTest:(id)sender {
    [self call];
}

@end 

まとめ

今回は、そのほかの処理を入れませんでしたが、非同期処理、並列処理の際は必要となると思いますので、
より実用的な形で使えるよう勉強を続けたいと思います。
加えて、デリゲート比べて、簡単に書けるため、用途に応じて使い分けたいと思います。