通称GCD。
勉強不足なもので、非同期処理するにはNSThreadとかNSOperationQueueとか使うもんだと思ってましたが、この新しいテクノロジであるGCDを使えば、もっとずっとシンプルに複雑なものごとを解決できます。
使わないと損です。
なので時期的には今さらですし、他のサイト見たほうがいいんですが書いときます。
たとえば重い処理をUIの裏で実行して結果が出てきたらUIに反映する。これ言うほど簡単じゃないですが、GCDなら簡単に書けます。
- (IBAction)onClick:(id)sender { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // UIと関係なく実行できる重い処理を別スレッドでやる NSData *data = [[HardWork new] doYourJobWithVeryHard:YES]; // 結果が出たらメインスレッドで以下の実行を依頼(UIはメインスレッドでのみ動く) dispatch_async(dispatch_get_main_queue(), ^{ [self updateMyData:data]; }); }); }
非同期処理がまるで同期的に書けてしまいます。dispatch_asyncと^{ }で囲むだけ!
やるべき処理の内容が複数箇所に分散しないで書けるのがいいですね。
また、performSelector:系だと渡せる引数は1個という制限が地味に面倒でしたが、ブロックで渡すのでコンテキストで見えてる値はなんでも参照できるのもありがたい。
気になったのは、dispatch_asyncの第2引数のブロックはBlock_copyされるとドキュメントにはあるのですが、そこでメモリが足りなかった場合何が起きるのでしょうか、という点。
dispatch_asyncの戻り値はvoidなのでエラーが返ることはないし...。でもBlock_copyは失敗する可能性あるだろっ、ていう。