2013-07-11 41 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() 
    } 
} 
相關問題