45-Swift之UserDefaults數(shù)據(jù)存儲(chǔ)

一椒拗、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ù)")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衔憨,一起剝皮案震驚了整個(gè)濱河市叶圃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌践图,老刑警劉巖掺冠,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異码党,居然都是意外死亡德崭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門揖盘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來接癌,“玉大人,你說我怎么就攤上這事扣讼。” “怎么了缨叫?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵椭符,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我耻姥,道長(zhǎng)销钝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任琐簇,我火速辦了婚禮蒸健,結(jié)果婚禮上座享,老公的妹妹穿的比我還像新娘。我一直安慰自己似忧,他們只是感情好渣叛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盯捌,像睡著了一般淳衙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饺著,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天箫攀,我揣著相機(jī)與錄音,去河邊找鬼幼衰。 笑死靴跛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渡嚣。 我是一名探鬼主播梢睛,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼严拒!你這毒婦竟也來了扬绪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤裤唠,失蹤者是張志新(化名)和其女友劉穎挤牛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體种蘸,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓赴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了航瞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫硕。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刊侯,靈堂內(nèi)的尸體忽然破棺而出章办,到底是詐尸還是另有隱情,我是刑警寧澤滨彻,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布藕届,位于F島的核電站,受9級(jí)特大地震影響亭饵,放射性物質(zhì)發(fā)生泄漏休偶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一辜羊、第九天 我趴在偏房一處隱蔽的房頂上張望踏兜。 院中可真熱鬧词顾,春花似錦、人聲如沸碱妆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽山橄。三九已至垮媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間航棱,已是汗流浹背睡雇。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饮醇,地道東北人它抱。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朴艰,于是被迫代替她去往敵國(guó)和親观蓄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容