2013-07-11 44 views
6

在我的应用程序中,我想存储应用程序第一次启动的日期。
我用下面的代码在应用中:didFinishLaunchingWithOptions方法
iOS - 无法将NSDate存储到NSUserDefaults中

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

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

但每次当我启动应用程序,其打印在该应用程序被启动的时间。它不打印我启动应用程序的日期。

我试着重置模拟器并再次运行代码。仍然没有成功。有人可以指出我的代码中的错误吗?

+1

你不忘记[默认同步]; ? –

+1

如果您在每次启动应用程序时都设置日期,为什么您希望看到与当前日期不同的内容? – rmaddy

+0

@rmaddy,对不起,我更新了我的代码 – Satyam

回答

14

因为你的目标是跟踪的第一次用户启动您的应用程序,你需要像这样在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); 
+0

,因为registerDefaults只会在应用程序的下一次启动时第一次被调用,因为默认值已经设置,所以不会再次设置默认值。预计NSUserDefaults将永久存储数据。不是吗? – Satyam

+3

不,每次调用'registerDefaults'时都会调用它。 'registerDefaults'不写任何东西。它只提供一个值,如果调用检索值会返回'nil'。在这种情况下,使用'registerDefaults'是没有意义的。 – rmaddy

+1

非常感谢您的澄清。 – Satyam

5

设置该值后需要拨打[[NSUserDefaults standardDefaults] synchronize]

Apple Docs

在运行时,您使用的对象NSUserDefaults的读取该 您的应用程序从用户的默认数据库使用的默认值。 NSUserDefaults 缓存信息以避免每次需要默认值时都必须打开用户的默认值 数据库。同步方法, ,其在周期性的间隔自动调用,保持 内存中缓存在同步与

用户的默认数据库中。

+0

您的更新证明了我的观点。操作系统将自动为您同步用户默认设置。 – rmaddy

+0

没有完全明白他在问什么 –

-1

可以存储并以这种方式

VAR检索startDate:NSDate? {

get { 
     return NSUserDefaults.standardUserDefaults().objectForKey(BCGConstants.UserDefaultsKey.startDateKey) as? NSDate 
    } 

    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: BCGConstants.UserDefaultsKey.startDateKey) 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
} 
相关问题