当我的应用程序在iOS上终止时,保存NSUserDefaults的正确方法是什么

时间:2013-09-22 06:23:02

标签: ios nsuserdefaults

当我的应用在iOS中完全退出时,我需要保存NSUserDefault。 不是didenterbackgroundforeground。 仅当用户在iOS中使用减号( - )符号终止我的应用时。

所以我在applicationWillTerminate的{​​{1}}中写下以下代码。

AppDelegate

但它不会保存到- (void)applicationWillTerminate:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"iCloud"]; [[NSUserDefaults standardUserDefaults] synchronize]; }

那么我应该在哪里写保存我的数据?

4 个答案:

答案 0 :(得分:2)

来自Apple Doc

  

适用于不支持后台执行或已关联的应用   对于iOS 3.x或更早版本,此方法始终在用户时调用   退出应用程序。对于支持后台执行的应用程序,此方法   通常不会在用户退出应用程序时调用,因为该应用程序   在这种情况下简单地移动到背景。但是,这种方法可能   在应用程序在后台运行的情况下调用   (未暂停)系统需要因某种原因终止它。

当您的应用退出时,applicationWillTerminate没有必要被调用,当您的应用支持后台执行时,可能无法调用

您可以使用UIApplicationExitsOnSuspend指定应该终止该应用,而不是在退出时将其移至后台。

我担心,没有任何委托方法会狡猾地处理应用程序的力量 - 非常情况。

希望这可以帮助您解决问题。

答案 1 :(得分:2)

当应用程序从多任务栏结束时,就会被杀死。没有调用委托方法。当主页按钮被点击时,对于不支持多任务处理的应用程序调用{​​{1}}。

默认情况下,应用程序支持多任务处理,因此您应该在didEnterBackground中执行所有操作。之后,您无法保证将再次调用您的任何代码。

答案 2 :(得分:2)

您可以在info.plist文件中设置Application does not run in background" = "YES",然后可以看到applicationWillTerminate委托被调用&将值存储在NSUserDefaults

enter image description here

答案 3 :(得分:1)

问题在于applicationWillTerminate根本没有被调用。

如下所示更改applicationDidEnterBackground并在20秒内终止您的应用程序。 你可以看到applicationWillTerminate被叫&在iCloud

中正确设置NSUserDefaults
- (void)applicationDidEnterBackground:(UIApplication *)application
{

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i=0; i < 20; i++) {
            NSLog(@"%d", i);
            sleep(1);
        }
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    });
}