0

我正在保存当前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

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

编辑:

NSUserDefaultsNSNotificationCenter像这样被调用:

调用 via 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通过确保它仅在应用程序第一次启动时才被初始化来解决问题。

4

3 回答 3

0

嘿,从 NSUserDefaults 检索数据时,不要根据苹果文档再次同步

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

所以其中存在的日期可能会再次修改......

我希望这很好用…………

于 2013-04-13T16:06:57.640 回答
0

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

于 2013-04-13T16:19:12.083 回答
0

我发现了问题 - 我在 -(void)didFinishLaunchingWithOptions 中初始化它,但不是作为

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]

所以每次应用程序启动时它都会被覆盖。

将第一个设置添加到 defaultsDictionary 通过确保它仅在应用程序第一次启动时才被初始化来解决问题。

于 2013-04-16T12:08:56.393 回答