Objective-C の達人、
次のマクロを使用して、ブロックがメインスレッドで実行されるようにしています。アイデアは単純です。現在メイン スレッドを使用している場合は、すぐにブロックを実行します。現在のスレッドがメイン スレッドでない場合は、ブロックをキューに入れ、メイン スレッドで非同期に実行します (現在のスレッドをブロックしないようにします)。
これに問題はありますか?ここに安全でないもの、または私が気付いていないエラーを引き起こしているものはありますか? これを行うより良い方法はありますか?
#define run_on_main(blk) if ([NSThread isMainThread]) { blk(); } else { dispatch_async(dispatch_get_main_queue(), blk); }
使用例:
-(BOOL)loginCompletedSuccessfully
{
NSLog(@"loginCompletedSuccessfully");
// This may be called from a network thread, so let's
// ensure the rest of this is running on the main thread.
run_on_main(^{
if (_appStartupType == AppLaunch) {
self.storyboard = [UIStoryboard storyboardWithName:DEVICED(@"XPCStoryboard") bundle:nil];
self.navigationController = [storyboard instantiateInitialViewController];
}
[self.window setRootViewController:self.navigationController];
});
return YES;
}