u16suzuの blog

日々学んだことのメモブログです。

Objective-C でマルチスレッドプログラミング

マルチスレッド処理のやり方がいくつかあるが、それぞれ試してみた。 GCDが最近の書き方らしいけど、まだまだgithubに上がっているライブラリをみると NSOperationを使っていたりするので、ひと通りやってみました。

    // part1 シンプルなパターン
    [self performSelectorInBackground:@selector(hoge) withObject:nil];
    [self performSelectorInBackground:@selector(fuga) withObject:nil];
    
    // part2 NSOperationをつかう
    NSOperationQueue *queue = [NSOperationQueue new];
    MyOperation *operation = [MyOperation new];
    [queue addOperation:operation];
    
    // part3 NSOperationの継承クラスを作らなくても良い
    NSInvocationOperation *invOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(aaa) object:nil];
    [queue addOperation:invOperation];
    
    // part4 GCD
    dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_queue_t sub = dispatch_queue_create("example.com", NULL);
    dispatch_async(sub, ^{
        //何か重たい処理
        for (int i=0; i<10000; i++) NSLog(@"%d", i);
        dispatch_async(main, ^{
            //重たい処理が終わったとき
            NSLog(@"%@", @"finish");
        });
    });

MyOperationクラスはこんな感じ

// MyOperation.h
#import <Foundation/Foundation.h>

@interface MyOperation : NSOperation

@end

// MyOperation.m
#import "MyOperation.h"

@implementation MyOperation
// method名は startか mainである必要がある
-(void)start{
    for (int i=0; i<10000000; i++) NSLog(@"%@", @"def" );
}
@end