2013-07-11 29 views
6

Trong ứng dụng của tôi, tôi muốn lưu trữ ngày mà ứng dụng được bắt đầu lần đầu tiên.
Tôi đang sử dụng đoạn mã sau trong ứng dụng: didFinishLaunchingWithOptions phương pháp
iOS - Không thể lưu trữ NSDate vào NSUserDefaults

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

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

Nhưng mỗi khi tôi khởi động ứng dụng, in ấn của nó thời gian mà tại đó các ứng dụng được khởi động. Nó không in ngày mà tôi bắt đầu ứng dụng.

Tôi đã cố gắng đặt lại trình mô phỏng và chạy lại mã. Vẫn không thành công. Có thể một số một điểm cho tôi lỗi trong mã của tôi xin vui lòng?

+1

Bạn không quên [mặc định đồng bộ hóa]; ? –

+1

Nếu bạn đặt ngày mỗi khi bạn khởi chạy ứng dụng, tại sao bạn mong đợi thấy bất kỳ điều gì khác với ngày hiện tại? – rmaddy

+0

@rmaddy, Xin lỗi, tôi đã cập nhật mã của mình – Satyam

Trả lời

14

Vì mục tiêu của bạn để là theo dõi các lần đầu tiên người dùng bắt đầu ứng dụng, bạn cần một cái gì đó như thế này trong 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

kể từ khi đăng kýDefault sẽ được gọi là lần đầu tiên, từ lần khởi động tiếp theo của ứng dụng, mặc định đã được đặt, nó sẽ không đặt lại giá trị mặc định. NSUserDefaults dự kiến ​​sẽ lưu trữ dữ liệu vĩnh viễn. Phải không? – Satyam

+3

Không, 'registerDefaults' được gọi mỗi lần bạn gọi nó. 'registerDefaults' KHÔNG viết gì cả. Nó chỉ cung cấp một giá trị nếu một cuộc gọi để lấy một giá trị nếu không sẽ trả về 'nil'. Trong trường hợp này, việc sử dụng 'registerDefaults' sẽ không có ý nghĩa gì cả. – rmaddy

+1

cảm ơn rất nhiều để làm rõ. – Satyam

5

Bạn cần gọi [[NSUserDefaults standardDefaults] synchronize] sau khi bạn đặt giá trị.

Từ Apple Docs:

Khi chạy, bạn sử dụng một đối tượng NSUserDefaults để đọc giá trị mặc định rằng ứng dụng của bạn sử dụng từ cơ sở dữ liệu mặc định của người dùng. NSUserDefaults lưu trữ thông tin để tránh phải mở các giá trị mặc định của người dùng mỗi khi bạn cần giá trị mặc định. Phương pháp đồng bộ hóa, mà được tự động gọi trong khoảng thời gian định kỳ, giữ cho bộ nhớ cache trong bộ nhớ đồng bộ với

cơ sở dữ liệu mặc định của người dùng.

+0

Bản cập nhật của bạn chứng tỏ quan điểm của tôi. Hệ điều hành sẽ tự động đồng bộ hóa mặc định của người dùng cho bạn. – rmaddy

+0

Không hoàn toàn hiểu những gì anh ta yêu cầu –

-1

Bạn có thể lưu trữ và lấy theo cách này

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() 
    } 
} 
Các vấn đề liên quan