2013年7月19日金曜日

ディスパッチキューを使って並列処理(マルチスレッド)を行う

並列処理(マルチスレッド)を実装できるディスパッチキューについてです。

並列処理(マルチスレッド)の実装方法

並列処理(マルチスレッド)を実装するには、キューを作成し、そのキューに平行処理させたいメソッドなどを登録することで実現できます。

キューの作成

キューの作成です。

メインスレッドで処理を実行する"mainQueue"とバックグラウンドで実行する"subQueue"を用意します。

ViewController.h

@interface ViewController ()
{
    dispatch_queue_t mainQueue;  // メインキュー
    dispatch_queue_t subQueue;  // サブキュー
}
@end

各キューを定義します。

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // メインキュー定義
    mainQueue = dispatch_get_main_queue();
    // サブキュー定義。
    subQueue = dispatch_queue_create("jp.blogspot.obc-fight.myApp.myQueue", 0);
    
    // 今回呼ぶメソッド
    [self hoge];
    
}
dispatch_queue_createメソッドについて。
第1引数はキューの名前を付けます。これがどこで使われているかは現在は不明。
第2引数は基本的には"0"または"NULL"を指定しておけばよいそうです。

キューの登録

各キューに処理を登録します

ViewController.m

-(void)hoge
{
    // サブキュー実行
    dispatch_async(subQueue, ^{
        [self subQueueMethod];
    
        // メインキュー実行
        dispatch_async(mainQueue, ^{
            [self mainQueueMethod];
        });
    });
}

// メインキューで呼ばれるメソッド
-(void)mainQueueMethod
{
    NSLog(@"メインキュー実行");
}

// サブキューで呼ばれるメソッド
-(void)subQueueMethod
{
    NSLog(@"サブキュー実行");
}

// ログ
サブキュー実行
メインキュー実行

おわり

ディスパッチキューは他にもキューが存在したり処理を遅延させたりと、もっと複雑な処理も書けるようですが、今回ははじめて触ったのでこれくらいで。

参考記事

Objective-Cで並列処理を簡単に実装する方法 - YoheiM.NET
動画のストリーミング再生と保存を同時に行う - alperithm
Grand Central Dispatch - Nacho4d - programming notes

0 件のコメント:

コメントを投稿