一椒拗、NSUserDefaults && UserDefaults 的介紹
NSUserDefaults或者UserDefaults是一個(gè)分層的持續(xù)進(jìn)程間分布(可選)鍵值存儲(chǔ)優(yōu)化存儲(chǔ)用戶設(shè)置负拟。
二 铸史、 UserDefaults 的使用和方法介紹
1 须鼎、 UserDefaults的初始化
/**
創(chuàng)建一個(gè)對(duì)象
1惊来、standard
let NwUserDefaults = UserDefaults.standard
2厘灼、init
let NwUserDefaultsInit = UserDefaults.init()
3艇棕、init(suiteName: "NetWork")
let NwUserDefaultsString = UserDefaults.init(suiteName: "NetWork")
*/
let NwUserDefaults = UserDefaults.standard
2、 存儲(chǔ)各個(gè)類型的數(shù)據(jù)
/**
存儲(chǔ)數(shù)據(jù)函數(shù)
open func set(_ value: Any, forKey defaultName: String)
*/
/**
String 類型存儲(chǔ)數(shù)據(jù)
*/
let NWString = "NetWork小賤"
let NWStringKey = "StringKey"
NwUserDefaults.set(NWString, forKey: NWStringKey)
/**
Bool 類型存儲(chǔ)數(shù)據(jù)
*/
let NWBool = true
let NWBoolKey = "BoolKey"
NwUserDefaults.set(NWBool, forKey: NWBoolKey)
/**
Array 類型存儲(chǔ)
*/
let NWArray = ["110","119"]
let NWArrayKey = "ArrayKey"
NwUserDefaults.set(NWArray, forKey: NWArrayKey)
/**
Dictionary 類型存儲(chǔ)
*/
let NWDictionary = ["A":"110","B":"120"]
let NWDictionaryKey = "DictionaryKey"
NwUserDefaults.set(NWDictionary, forKey: NWDictionaryKey)
/**
Data 類型存儲(chǔ)
*/
let NWData = Data.init(base64Encoded: "NetWork")
let NWDataKey = "DataKey"
NwUserDefaults.set(NWData, forKey: NWDataKey)
/**
NSInteger 類型存儲(chǔ)
*/
let NWNSInteger = 2
let NWNSIntegerKey = "NSIntegerKey"
NwUserDefaults.set(NWNSInteger, forKey: NWNSIntegerKey)
/**
Float 類型存儲(chǔ)
*/
let NWFloat = 1.0
let NWFloatKey = "FloatKey"
NwUserDefaults.set(NWFloat, forKey: NWFloatKey)
/**
Double 類型存儲(chǔ)
*/
let NWDouble = 1.000000
let NWDoubleKey = "DoubleKey"
NwUserDefaults.set(NWDouble, forKey: NWDoubleKey)
/**
URL 類型存儲(chǔ)
*/
let NWURL = URL.init(string: "http://www.reibang.com/u/23dd8d9701bf")
let NWURLKey = "URLKey"
NwUserDefaults.set(NWURL, forKey: NWURLKey)
3召烂、將存儲(chǔ)的數(shù)據(jù)同步磁盤
/**
同步到磁盤
*/
NwUserDefaults.synchronize()
4 碱工、 獲取各個(gè)類型的存儲(chǔ)數(shù)據(jù)
/**
獲取值
常用的函數(shù):
open func object(forKey defaultName: String) -> Any?
*/
var UserDefaultValue : Any
UserDefaultValue = NwUserDefaults.object(forKey: NWStringKey) as Any
print(UserDefaultValue as! String)
/**
如果知道獲取數(shù)據(jù)的類型,就可以指定函數(shù)獲取其值
String
*/
UserDefaultValue = NwUserDefaults.string(forKey: NWStringKey) as Any
print(UserDefaultValue as! String)
/**
Array
*/
UserDefaultValue = NwUserDefaults.array(forKey: NWArrayKey) as Any
print(UserDefaultValue as! Array<Any>)
/**
Dictionary
*/
UserDefaultValue = NwUserDefaults.dictionary(forKey: NWDictionaryKey) as Any
print(UserDefaultValue as! Dictionary<String,Any>)
/**
Float
*/
UserDefaultValue = NwUserDefaults.float(forKey: NWFloatKey)
print(UserDefaultValue)
/**
Double
*/
UserDefaultValue = NwUserDefaults.double(forKey: NWDoubleKey)
print(UserDefaultValue)
/**
BOOL
*/
UserDefaultValue = NwUserDefaults.bool(forKey: NWBoolKey)
print(UserDefaultValue)
/**
Data
*/
UserDefaultValue = NwUserDefaults.data(forKey: NWDataKey) as Any
print(UserDefaultValue)
/**
URL
*/
UserDefaultValue = NwUserDefaults.url(forKey: NWURLKey) as Any
print(UserDefaultValue)
5奏夫、 移除一個(gè)存儲(chǔ)的數(shù)據(jù)
/**
要從存儲(chǔ)中移除某個(gè)對(duì)象
*/
NwUserDefaults.removeObject(forKey: NWBoolKey)
6怕篷、向注冊(cè)域設(shè)置數(shù)據(jù)
1、register 函數(shù)的介紹
register 函數(shù)介紹
該方法是添加一個(gè)具體的字典到注冊(cè)域酗昼。UserDefaults數(shù)據(jù)庫(kù)中其實(shí)是由多個(gè)層級(jí)的域組成的廊谓,當(dāng)你讀取一個(gè)鍵值的數(shù)據(jù)時(shí),NSUserDefaults從上到下透過域的層級(jí)尋找正確的值麻削,不同的域有不同的功能蒸痹,有些域是可持久的,有些域則不行呛哟。并且它默認(rèn)會(huì)包含5 個(gè) Domain叠荠, 分別是:
NSArgumentDomain: 參數(shù)域,有最高優(yōu)先權(quán)扫责。
Application: 應(yīng)用域(application domain)是最重要的域榛鼎,它存儲(chǔ)著你app通過UserDefaults set...forKey添加的設(shè)置。
NSGlobalDomain:全局域(global domain)則存儲(chǔ)著系統(tǒng)的設(shè)置鳖孤。
Languages: 語言域(language-specific domains)則包括地區(qū)者娱、日期等。
NSRegistrationDomain: 注冊(cè)域(registration domain)僅有較低的優(yōu)先權(quán)苏揣,只有在應(yīng)用域沒有找到值時(shí)才從注冊(cè)域去尋找黄鳍。
從上面 5 個(gè)Domain 的介紹上看出,我們經(jīng)常使用的 open func set(_ value: Any, forKey defaultName: String) 該函數(shù)是將數(shù)據(jù)存儲(chǔ)在 Application Domain 下腿准,同時(shí)持久保存數(shù)據(jù)际起。而 open func register(defaults registrationDictionary: [String : Any]) 該函數(shù)是將數(shù)據(jù)存儲(chǔ)到 NSRegistrationDomain 下拾碌,同時(shí)不是持久保存。
注意: 平時(shí)我們獲取數(shù)據(jù)的時(shí)候街望,實(shí)際上會(huì)在底層的存儲(chǔ)結(jié)構(gòu)中進(jìn)行一次搜索校翔,屬性搜索過程就是這樣:NSArgumentDomain -> Application -> NSGlobalDomain -> Languages -> NSRegistrationDomain,則對(duì)于注冊(cè)的優(yōu)先級(jí)是最低的。
2灾前、 register 函數(shù)的使用
/**
register 的測(cè)試
*/
let registerValue = NwUserDefaults.object(forKey: "register") as Any
print(registerValue)
NwUserDefaults.register(defaults: ["register":"NetWork小賤register"])
let registerValueLast = NwUserDefaults.object(forKey: "register")
print(registerValueLast!)
7防症、數(shù)據(jù)共享增加套件
/**
添加套件
套件的作用: 是實(shí)現(xiàn)App與App之間的數(shù)據(jù)共享
*/
NwUserDefaults.addSuite(named: "NetWork")
/**
移除套件
*/
NwUserDefaults.removeSuite(named: "NetWork")
8、在自定義的域名下存儲(chǔ)數(shù)據(jù)
/**
設(shè)置到自己定義的域名下,存儲(chǔ)數(shù)據(jù)
*/
NwUserDefaults.setPersistentDomain(["Ak":"47"], forName: "AK47")
/**
獲取數(shù)據(jù)
*/
let DomainDictionary = NwUserDefaults.persistentDomain(forName: "AK47")
print(DomainDictionary!)
/**
移除自定義的域名
*/
NwUserDefaults.removePersistentDomain(forName: "AK47")
9哎甲、檢測(cè)給定的Key 是否有搜索記錄
1蔫敲、獲取全部的搜索記錄
/**
返回您搜索取值的記錄
*/
let dictValue = NwUserDefaults.dictionaryRepresentation()
print(dictValue)
2、 判斷給定的值是否有搜索記錄
/**
判斷給定的key是否允許搜索
*/
let isPreferences = NwUserDefaults.objectIsForced(forKey: "AK47")
print(isPreferences)
/**
判斷給定的Key 在給定域名下是否有搜索記錄
*/
let isPreferencesDomain = NwUserDefaults.objectIsForced(forKey: "AK", inDomain: "AK47")
print(isPreferencesDomain)
10 炭玫、獲取部分域名的名字
/**
獲取域名
*/
全局域
print(UserDefaults.globalDomain)
參數(shù)域
print(UserDefaults.argumentDomain)
注冊(cè)域
print(UserDefaults.registrationDomain)
11奈嘿、 UserDefaults 添加監(jiān)控
/**
添加監(jiān)控
*/
/**
UserDefault 只要發(fā)生變動(dòng)(數(shù)據(jù)添加,刪除吞加,替換等)裙犹,就能觸發(fā)該通知。
*/
NotificationCenter.default.addObserver(self, selector: #selector(didChangeUserDefault), name:UserDefaults.didChangeNotification, object: NwUserDefaults)
方法實(shí)現(xiàn):
func didChangeUserDefault() -> Void {
print("用戶移除Double存儲(chǔ)數(shù)據(jù)")
}