2014年3月25日火曜日

Objective-Cで簡単に並列処理をする方法

プログラムで重い処理を実行すると、フリーズしたような状態になることがあります。
そういう場合、並列(非同期)処理をして、別スレッドに重い処理を持って行きます。
Objective-Cでのやり方を調べたので備忘録として記載しておきます。


NSOperationQueueを使用


NSOperationQueueを使用すると簡単にできます。


==========================

NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
    //重い処理
}];

==========================

ただ、このやり方だと次のような問題点があり、単純な処理しか行えません。

  • スレッドセーフでないオブジェクトを扱えない
  • スレッドの処理を終えた後の次の処理を行うのが簡単にできない



GCD(Grand Central Dispatch)の利用


GCDとはAPIを通して処理のブロックをキューに入れると、ランタイムの方で上手く並列実行してくれるという仕組みのことです。
このやり方だと、前の方法での問題点は解決できます。


==========================

dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q_main   = dispatch_get_main_queue();
dispatch_async(q_global, ^{
    
    //重い処理
    
    dispatch_async(q_main, ^{
        
        //重い処理が終わった後の処理
        
    });
});

==========================



並列処理というと難しい印象がありますが、GCDを使えば簡単ですね。






0 件のコメント:

コメントを投稿