以前は 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(),
^{
// 処理
}
);
}