當前位置:成語大全網 - 新華字典 - Swift下UserDefaults的常見使用和註意事項

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 Introduction

[NSUserDefaults synchronize] is Planned to be Deprecated

以上大多是壹些需要註意的問題。關於Swift的常見用法,已經有很多博客在詳述了,可以參考: Swift:UserDefaults協議(Swift視角下的泛字符串類型API)