11

私のアプリには、オンラインデータベースからコアデータ要素を更新するNSOperationがあり、更新には数分かかることがあります。iPhoneの画面がロックされると、アプリはバックグラウンドモードになり、この更新は停止します。アプリを再度開いて更新を続行するため、スタックオーバーフローについて多くの検索を行い、次の情報を見つけました。

beginBackgroundTaskWithExpirationHandler

これは、アプリがバックグラウンドモードのときにもいくつかのタスクを続行できるようにするアップルのメソッドであり、私はこれを実行しています:

- (void)applicationDidEnterBackground:(UIApplication *)application
{

UIApplication  *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];
}

そして今、アプリはバックグラウンドでタスクを続行し、すべてが正常に機能しているように見えるので、私の質問は、私が使用するこの方法は安全ですか?またはより良いモードがありますか?

ありがとう

4

1 に答える 1

16

それはあなたがこれを行う方法ではありません。バックグラウンドで実行するコードはすべて、適切にラップする必要があります。このようなもの:

- (void)someMethodToKeepRunningInBackground {
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
        // Uh-oh - we took too long. Stop task.
    }];

    // Perform task here        

    if (taskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:taskId];
    }
}

メソッドでは何もしませんUIApplicationDelegate applicationDidEnterBackground:

「バックグラウンドタスク」呼び出し内にラップされているタスクは、アプリがバックグラウンドに入ったときに実行を継続できます。

これが本当に重要な部分です-タスクは最大10分しか取得できません。10分経っても実行されている場合、アプリは終了します。有効期限ハンドラーは、アプリが不正に終了する前に、タスクを正常に終了するための数秒を提供します。

于 2012-11-26T23:46:11.157 に答える