我正在保存当前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
像这样被调用:
调用 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
通过确保它仅在应用程序第一次启动时才被初始化来解决问题。