如果app被杀死,NSUserDefaults将返回当前时间而不是存储时间

时间:2013-04-13 12:44:01

标签: iphone ios objective-c nsuserdefaults

我正在NSDate中保存当前NSUserDefaults,以便将其与应用返回前景或再次激活时的当前时间进行比较。

所以我用它来存储它:

NSUserDefaults *stateOfPlay = [NSUserDefaults standardUserDefaults];

NSDate *timeBackgrounded = [NSDate date];

[stateOfPlay setObject:timeBackgrounded forKey:@"timeBackgrounded"];
[stateOfPlay synchronize];

这是为了检索它。

NSUserDefaults *stateOfPlay = [NSUserDefaults standardUserDefaults];
[stateOfPlay synchronize];

NSDate *timeBackgrounded = [stateOfPlay objectForKey:@"timeBackgrounded"];   

当应用程序背景并返回时,一切正常。见NSLog:

<Warning>: saved timeBackgrounded: 2013-04-13 12:21:01 +0000
...
<Warning>: read timeBackgrounded: 2013-04-13 12:21:01 +0000
<Warning>: current time: 2013-04-13 12:22:54 +0000

到目前为止一切顺利。但是当我在后台运行后杀死应用程序然后重新启动它时,不再从NSUserDefaults返回它背景的时间。相反,它返回当前时间。

<Warning>: saved timeBackgrounded: 2013-04-13 12:23:09 +0000
...
<Warning>: read timeBackgrounded: 2013-04-13 12:23:43 +0000
<Warning>: current time: 2013-04-13 12:23:43 +0000

当我再次启动应用程序时,我正在存储的其他内容(某些整数)正在返回。那我错过了什么?

修改

NSUserDefaults正在通过NSNotificationCenter调用,如下所示:

通过NSNotificationCenter致电,如下:

[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(goBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];

//if app foregrounds or opens, adjust score for time in background

[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(goForeground)
name:UIApplicationWillEnterForegroundNotification
object:nil];

我可以从控制台看到,当应用程序前景或背景时,每个都正确地触发;但是在杀死之后,从NSUserDefaults返回的时间是当前时间而不是存储在那里的时间。

编辑#2

我发现了问题 - 我在didFinishLaunchingWithOptions:初始化它,但不是[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]的喘气。因此,每次应用程序启动时都会被覆盖。

将第一个设置添加到defaultsDictionary可以确保只在应用程序首次启动时才初始化,从而解决了这个问题。

3 个答案:

答案 0 :(得分:0)

嘿,从NSUserDefaults检索数据时,请不要再根据apple doc进行同步

<强>同步 将对持久域的任何修改写入磁盘,并将所有未修改的持久域更新为磁盘上的内容。

因此存在的日期可能会再次修改.....

我希望这很好用.........

答案 1 :(得分:0)

我在这里看到的一件事是你为NSUserDefaults调用getter / setter的地方。 检查是否一直在更新打开应用程序,查看控制器转换等。

答案 2 :(得分:0)

我发现了问题 - 我正在初始化 - (void)didFinishLaunchingWithOptions,但不是

的一部分
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]

因此每次应用程序启动时都会被覆盖。

将第一个设置添加到defaultsDictionary中可以确保它在第一次启动应用程序时才初始化,从而解决了这个问题。