6

次のようなバックグラウンド タスクを開始しています。

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 で問題が解決したのはなぜですか?

前もって感謝します!

4

1 に答える 1