iOS - 无法将NSDate存储到NSUserDefaults中

6

在我的应用程序中,我希望存储应用程序首次启动的日期。
我在application:didFinishLaunchingWithOptions方法中使用以下代码:

NSDate* today = [NSDate date];
[[NSUserDefaults standardUserDefaults] registerDefaults: @{@"CONSCIENCE_START_DATE" : today}];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]);

但是每次我启动应用程序时,它都会打印出应用程序开始的时间,而不是打印我启动应用程序的日期。
我尝试重置模拟器并再次运行代码,但仍然没有成功。请问有人能指出我的代码中的错误吗?

1
你不要忘记执行 [defaults synchronize]; 了吧? - Dmitry Zhukov
1
如果您每次启动应用程序都设置日期,为什么期望看到的不是当前日期? - rmaddy
@rmaddy,抱歉,我更新了我的代码。 - Satyam
为什么要注册一个默认值?你的目标是什么?你想要仅在用户第一次启动应用程序时存储日期吗?然后你想要能够读取那个一次性的日期? - rmaddy
@rmaddy,你是对的。只有在应用程序第一次启动时,我想要存储日期。之后,我只想读取那个一次性日期。 - Satyam
2个回答

15

如果您的目标是跟踪用户首次启动应用程序的时间,您需要在application:didFinishLaunchingWithOptions中添加类似下面的代码:

NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"];
if (!date) {
    // This is the 1st run of the app
    date = [NSDate date];
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"CONSCIENCE_START_DATE"]; // Save date
}

NSLog(@"First run was %@", date);

由于registerDefaults只会在第一次调用时被调用,所以从下一次应用程序启动开始,由于默认值已经设置,它不会再次设置默认值。预计NSUserDefaults将永久存储数据。不是吗? - Satyam
3
不,每次调用registerDefaults时都会被执行,registerDefaults不会写入任何内容,它只在检索到一个值为nil时提供默认值。在这种情况下,使用registerDefaults没有意义。 - rmaddy

4
在设置完值后,您需要调用[[NSUserDefaults standardDefaults] synchronize]。根据Apple文档,在运行时,您可以使用一个NSUserDefaults对象从用户的默认数据库中读取应用程序使用的默认值。NSUserDefaults缓存信息以避免每次需要默认值时打开用户的默认数据库。自动调用的synchronize方法定期保持内存中的缓存与用户的默认数据库同步。

你的更新证明了我的观点。操作系统会自动为你同步用户默认设置。 - rmaddy
不太明白他在问什么。 - Alfie Hanssen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接