我正在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
可以确保只在应用程序首次启动时才初始化,从而解决了这个问题。
答案 0 :(得分:0)
<强>同步强> 将对持久域的任何修改写入磁盘,并将所有未修改的持久域更新为磁盘上的内容。
因此存在的日期可能会再次修改.....
我希望这很好用.........
答案 1 :(得分:0)
我在这里看到的一件事是你为NSUserDefaults调用getter / setter的地方。 检查是否一直在更新打开应用程序,查看控制器转换等。
答案 2 :(得分:0)
我发现了问题 - 我正在初始化 - (void)didFinishLaunchingWithOptions,但不是
的一部分[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]
因此每次应用程序启动时都会被覆盖。
将第一个设置添加到defaultsDictionary中可以确保它在第一次启动应用程序时才初始化,从而解决了这个问题。