0

アプリケーションがバックグラウンドに移行している間、長時間実行されるクリーンアップ操作を実行する必要があります。クリーンアップ操作はネットワーク トランザクションであり、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 をロードしたにもかかわらず、アプリケーションの再起動時にログイン画面が表示されない理由を考えてください。

4

1 に答える 1

0

その後に記述したコードはbeginBackgroundTaskWithExpirationHandler、非同期で実行されるため、実行する機会がありません。バックグラウンド タスクとして宣言されたタスクは、期待どおりに実行されるように同期する必要があります。

于 2013-08-10T10:36:47.323 に答える