Objective-C
iPhone

Main thread で実行

More than 3 years have passed since last update.

以前は NSObject
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait などを利用していた。

引数が0または1しか取れない、メソッドをわざわざ作る必要がある、など不便な点が多かった。引数増やすときは NSInvocation で回避できたが、やっぱり面倒だった。

GCD を使ったほうが簡単。

dispatch_async(
    dispatch_get_main_queue(),
    ^{
        // ここに実行したいコード
    }
);

同期実行したいときは dispatch_async() の代わりに dispatch_sync() を使う。

Main thread から dispatch_sync で main queue に突っ込もうとすると誰も処理できずに詰まるので注意。
どの thread から呼ばれるかわからない場合は自分がどの thread にいるかチェックする。
(もっと良い方法あるかな?)

if ([NSThread isMainThread]) {
    // 処理
} else {
    dispatch_sync (
        dispatch_get_main_queue(),
        ^{
            // 処理
        }
    );
}