Edited at

Main thread で実行

More than 5 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(),
^{
// 処理
}
);
}