次のようなバックグラウンド タスクを開始しています。
UIApplication* application = [UIApplication sharedApplication];
_backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
{
[application endBackgroundTask:_backgroundTask];
_backgroundTask = UIBackgroundTaskInvalid;
}];
アプリはバックグラウンドに送信され、すべて問題ありません。
しばらくして、特定の条件が満たされ、一部のオブジェクトが次のコードを実行することになります。
[self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:YES];
その時点で、アプリがクラッシュします。
この特定のケースでは、オブジェクトがメイン スレッドで実行されていることに注意してください。
上記のコードを次のコードに置き換えました。
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
そして、すべて問題ないようです。クラッシュはなくなりました。
私が想像できるのは、waitUntilDone:YES がここでの違いである可能性があるということですが、それは私の直感にすぎません。
私の質問は:
アプリがバックグラウンドで実行されているときに、 performSelectorOnMainThread:withObject:waitUntilDone:YES を使用できますか?
その場合、アプリがクラッシュするのはなぜですか?また、dispatch_async で問題が解決したのはなぜですか?
前もって感謝します!