A. Swift下UserDefaults的常見使用和注意事項
UserDefaults 適合存儲輕量級的本地客戶端數據,這是一種常見的數據持久化方式。(建議:如果是存儲大批量的數據不要使用這個方法)
這個方法可以基於iCloud做跨設備的UserDefaults數據存儲,參考 NSUbiquitousKeyValueStore
這個方法可以獲得當前App存儲的所有UserDefaults數據
這個通知可以在UserDefault發生改變時發出。可以考慮當這個通知發生時全局進行同步數據。 UserDefaults.didChangeNotification
在iOS7或者7以下,一般只會在app返回background的時候才會保存數據到disk,但是iOS8以及以上之後app都會在極其短的周期內去保存數據,除非極其頻繁且大規模地進行寫入的操作,一般而言都會在可接受的時間內完成這項操作。
在iOS8以及以上,讀數據大約需要0.5微妙的時間,但是寫入數據需要10倍左右的時間,需要將key-valu通過 NSPropertyListSerialization 轉化成plist data
總而言之,iOS8以及以上的系統內不太建議使用 synchronize() 方法
enum for Keys used to store data
Save in UserDefaults where you want
Retrieve data anywhere in app
Remove Values
利用UserDefaults我們可以方便地存取一些簡單的資料,然而當我們存取的資料類型是Int,Bool,Float,Double時,卻會遇到一個特別的問題。因為她們回傳的類型不是optional,所以不會返回nil,而是一個預設的值,比如0,false之類。可能我們存在一些需求,希望沒有存儲值時返回nil,那麼有兩種方式可以解決這個問題。
這個方法的返回值是不可選的,會有默認值
更多參考:
有些是返回可選類型的
使用register(defaults:)設定找不到key對應的value時回傳的預設值,比如nil
register設定的內容是暫存的,並沒有存檔,所以每次App啟動時都要再設定一次。(並且沒有設為nil這種操作,設為nil意味著取消該項的設置,後面取值時依舊會採用默認值)
通過回傳Any?的 object(forKey:) 搭配 as? 轉型判斷
這個方法返回值是可選的
比如:
由於回傳的類型是Any?,所以找不到key number對應的value時會回傳nil
參考鏈接: UserDefaults預設值
value(forKey:) 是KVC的語法,它並不是一個UserDefaults的直接方法。所以最好不要在 UserDefaults
Never use value(forKey:) on UserDefaults or Dictionary or any other class unless you have a clearly understood need to use key-value coding to get the desired result.
When you don't have such a need, use the standard access methods provided by UserDefaults object(forKey:)
再補充一點:
The value(forKey:) is not a UserDefaults-only method. It is enabled by the NSKeyValueCoding , which, According to Apple's Documentation.
NSKeyValueCoding is an informal protocol that objects adopt to provide indirect access to their properties. When an object is key-value coding compliant, its properties are addressable via string parameters through a concise, uniform messaging interface.
It happens that UserDefaults is NSKeyValueCoding compliant, so people have started (not necessarily in the correct way) using it for accessing UserDefaults.
簡而言之,UserDefaults也是遵循了 NSKeyValueCoding 協議的,所以使用 value(forKey:) 也是可以獲取到數據,但是不建議這種用法。在 UserDefaults 裡面最好使用 object(forKey:) ,這是標准用法
參考鏈接: 在UserDefaults中object(forKey:)和value(forKey:)的區別
NSUserDefaults — A Swift Introction
[NSUserDefaults synchronize] is Planned to be Deprecated
以上大多是一些需要注意的問題。關於Swift的常見用法,已經有很多博客在詳述了,可以參考: Swift:UserDefaults協議(Swift視角下的泛字元串類型API)