4

ユーザーがホームボタンを押したときにコアデータを保存しようとしています。からやりたかったのです-applicationDidEnterBackground:が、呼ばれていません。これは、ここからCore Dataを保存できないか、操作を完了するのに十分な時間がないためである可能性があります。ただし-applicationWillResignActive:、これを実行するのに最適なデリゲート方法であり、なぜ機能しないのか、私は興味があり-applicationDidEnterBackground:ます。(出力からわかるように、両方のメソッドが呼び出されています。保存を削除して-applicationWillResignActive:も何も起こらないため、一方が他方をブロックしている状況ではありません)

// CALLS SAVE
- (void)applicationWillResignActive:(UIApplication *)application {
    [[self model] saveCoreData:@"SAVE FROM: applicationWillResignActive"];
    NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__);
}

// DOES NOT CALL SAVE
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [[self model] saveCoreData:@"SAVE FROM: applicationDidEnterBackground"];
    NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__);
}

// CONSOLE OUTPUT
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationWillResignActive:]
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationDidEnterBackground:]
2013-03-21 cvb[6724:907]  
2013-03-21 cvb[6724:907] SAVE: SAVE FROM: applicationWillResignActive
2013-03-21 cvb[6724:907] SAVE: Saving successful ...

編集:

これは私が最後にしたことです:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    [[self model] saveCoreData:@"[ENTERING BACKGROUND]"];
}
4

1 に答える 1

2

UIApplicationDelegate プロトコル リファレンスを確認してください。

基本的に、これはあなたが興味を持っているかもしれない部分ですapplicationDidEnterBackground:

このメソッドが終了する前に、ユーザー インターフェイスの調整に関連するすべてのタスクを実行する必要がありますが、他のタスク (状態の保存など) は、必要に応じて同時ディスパッチ キューまたはセカンダリ スレッドに移動する必要があります。applicationDidEnterBackground: で開始したバックグラウンド タスクは、そのメソッドが終了するまで実行されない可能性が高いため、これらのタスクを開始する前に追加のバックグラウンド実行時間を要求する必要があります。つまり、最初に beginBackgroundTaskWithExpirationHandler: を呼び出してから、ディスパッチ キューまたはセカンダリ スレッドでタスクを実行します。

于 2013-03-21T13:13:16.913 に答える