2010-07-07 34 views
9

Tôi đang phát triển một ứng dụng iPhone, tôi gặp phải sự cố trên iOS4 vì nhiều tác vụ.Cách nhận bản cập nhật NSUserDefault trên iOS 4?

Ứng dụng này có cài đặt mặc định được xác định trong Settings.bundle. Nếu tôi chạy ứng dụng của tôi sau đó tôi rời nó (vì vậy nó đi trong nền). Tôi sẽ thay đổi các thiết lập và khởi động lại ứng dụng (nó đi ra khỏi chế độ chờ và phương thức: applicationDidBecomeActive() được gọi).

Giá trị trong NSUserDefault không phải là bản cập nhật, nhưng khi tôi rời khỏi ứng dụng và khởi chạy lại. Các giá trị là tốt.

Có ai đó gặp sự cố tương tự như tôi không? Tôi đang làm gì sai?

Cảm ơn lời khuyên/trợ giúp của bạn.

+0

Bạn có làm mới các giá trị mặc định sau khi ứng dụng của bạn hoạt động trở lại không? Nếu bạn không, thì bạn nên theo họ thay đổi trong khi ở chế độ nền. – iwasrobbed

Trả lời

20

tôi đã có vấn đề tương tự như bạn, và nhận được xung quanh nó bằng cách gọi

[[NSUserDefaults standardUserDefaults] synchronize]; 

trong applicationDidBecomeActive.

Vì lý do nào đó, đối tượng [NSUserDefaults standardUserDefaults] bạn có thể truy cập trong ứng dụng của bạn không được đồng bộ hóa với các tệp plist thực sự sao lưu khi ứng dụng hoạt động trở lại sau khi bị tạm ngưng. Gọi phương thức synchronize buộc đồng bộ hóa.

+0

Điều quan trọng cần nhấn mạnh là đồng bộ hóa PHẢI được gọi sau khi bạn thay đổi NSUserDefaults nếu bạn muốn ghi những thay đổi đó vào một tệp. Nếu bạn không thay đổi sẽ được lưu trữ trong bộ nhớ. – Goles

+1

@ Mr.Gando Điều đó không đúng. 'NSUserDefaults' cũng được đồng bộ hóa định kỳ vào tập tin tự động. –

3

Bạn cần nghe các thay đổi cài đặt. Cách tốt nhất để làm điều đó là để thiết lập một người biết lắng nghe bất cứ nơi nào bạn cần nó:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingsChanged) name:NSUserDefaultsDidChangeNotification object:nil]; 

Điều duy nhất bạn cần phải chắc chắn được rằng bạn không thay đổi bất kỳ cài đặt trong người nghe của bạn, hoặc bạn nhận được vô hạn đệ quy mà không cần thêm chút logic nữa.

Tôi muốn tránh xa việc đồng bộ hóa vì theo kinh nghiệm của tôi, tôi thấy tôi phải chạy nó hai lần. Nhưng đó là hành vi ngẫu nhiên. Người nghe sẽ thông báo cho bạn khi cài đặt mới được đọc lại từ cửa hàng.

+0

Nhược điểm để sử dụng điều này, là nó cũng cháy khi bạn thay đổi bất cứ điều gì về 'NSUserDefaults' mình. Vì vậy, mỗi khi bạn gọi '[[NSUserDefaults standardUserDefaults] setObject: someObject forKey: @" someKey "]' thông báo này được phát, và phương thức được gọi. Mà không phải là những gì tôi (và có lẽ là người hỏi) muốn. Ngoài ra, tôi đã không có bất kỳ vấn đề với 'synchronize', gọi nó chỉ một lần làm việc tốt. –

+0

Cách này rõ ràng là tốt hơn. Chỉ cần cập nhật giá trị mặc định của người dùng và chỉ thực hiện thay đổi hành vi trong trình quan sát thông báo. Ngoài ra, bạn phải áp dụng bất kỳ thay đổi nào của người dùng điếc trong thời gian thực trong khi chạy ứng dụng với đa nhiệm iOS4. – Eonil

Các vấn đề liên quan