アプリケーションがバックグラウンドに移行している間、長時間実行されるクリーンアップ操作を実行する必要があります。クリーンアップ操作はネットワーク トランザクションであり、5 秒以上かかるため、beginBackgroundTaskWithExpirationHandler: API を使用していますが、すべて正常に動作しています。
以下に、わかりやすくするためにコードを追加します。
- (void)applicationDidEnterBackground:(UIApplication *)application {
@synchronized(self)
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[self performCleanUpOperation];
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
}
- (void) performCleanUpOperation
{
// Cleanup Network Operation
[(NSObject *)self performSelectorOnMainThread:(@selector(cleanUpDidFinish)) withObject:nil waitUntilDone:NO];
}
- (void) cleanUpDidFinish
{
dispatch_async(dispatch_get_main_queue(), ^(void){
[self saveContext];
[(CustomUIApplication *)[UIApplication sharedApplication] logoutWithAlert:NO];
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
今私が直面している問題は、アプリケーションをフォアグラウンドにすると、アプリがバックグラウンドに入る前の古い画面が表示されることです。そしてすぐに古い画面からログイン画面に移動します。
cleanUpDidFinish 内に Login ViewController をロードしたにもかかわらず、アプリケーションの再起動時にログイン画面が表示されない理由を考えてください。