二摸恍、NSUserDefaults

NSUserDefaults官方
它底層是一個xml格式的plist文件保存在應(yīng)用程序的沙箱中。


文檔中給了開發(fā)者提供了兩個例子:

  • 可以存儲一些應(yīng)用中常用的測量單位
  • 存儲用戶喜歡的多媒體播放速度

其實很好理解赤屋,如果應(yīng)用中的多媒體被作為單獨模塊拆分立镶,我們很容易將用戶偏好這部分邏輯方便的放置在模塊內(nèi)部,而實際上类早,它也確實應(yīng)該被放在那里媚媒。一般來說,小規(guī)模數(shù)據(jù)涩僻,弱業(yè)務(wù)相關(guān)數(shù)據(jù)缭召,都可以放到NSUserDefault里面,內(nèi)容比較多的數(shù)據(jù)逆日,強業(yè)務(wù)相關(guān)的數(shù)據(jù)就不太適合NSUserDefault了嵌巷。

在應(yīng)用程序運行期間數(shù)據(jù)庫中的數(shù)據(jù)可以多線程讀取這個沒有問題,但是設(shè)置值的時候室抽,NSUserDefaults會在使用線程中同步的修改這個值搪哪,但是其實真正持久化到數(shù)據(jù)庫的時候是異步的。同時NSUserDefaults也提供了方法用于強制將當(dāng)前值寫入持久存儲狠半。

同時需要注意的是不要在應(yīng)用程序中自己打開那些存儲文件噩死。
Don’t try to access the preferences subsystem directly. Modifying preference property list files may result in loss of changes, delay of reflecting changes, and app crashes. To configure preferences, use the defaults command-line utility in macOS instead.

存儲默認(rèn)對象

對于一些基礎(chǔ)的默認(rèn)數(shù)據(jù)類型颤难,NSUserDefaults提供了一些便捷方法來設(shè)置他們。包括:

  • float
  • double
  • integer
  • boolean
  • url

NSUserDefaults支持的可存儲的對象類型有:

  • NSData
  • NSString
  • NSNumber
  • NSDate
  • NSArray
  • NSDictionary
    其中集合中包含的對象也必須是他們中的一員已维,不行的話就只能歸檔了行嗤。

默認(rèn)值和域

NSUserDefaults 還有一個 Domain 的概念,當(dāng)我們調(diào)用 NSUserDefaults.standardUserDefaults() 方法時垛耳,就會初始化 NSUserDefaults栅屏, 并且它默認(rèn)會包含 5 個 Domain,分別是:

  • NSArgumentDomain
  • Application
  • NSGlobalDomain
  • Languages
  • NSRegistrationDomain

搜索順序如下:
NSArgumentDomain -> Application -> NSGlobalDomain -> Languages -> NSRegistrationDomain
關(guān)于這部分內(nèi)容可以參考該文:
NSUserDefaults - 熟悉與陌生

持久化文件引用

其實主要是通過在文件系統(tǒng)生成文件bookmark的做法來防止存放文件URL之后堂鲜,文件路徑被修改栈雳。
關(guān)于iOS中的URL可以參考這篇文章:
iOS-Foundation NSURL

響應(yīng)偏好改變

我們可以使用kvo來監(jiān)聽某個默認(rèn)值的變化。其中key為你存儲在用戶偏好中的值缔莲。

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:@"values.key"
    options:NSKeyValueObservingOptionNew
    context:NULL];

簡單點可以寫為

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"key"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];

關(guān)于沙盒的考慮

一個基于沙盒管理的App一般情況下是不能修改其他沙盒下的App的哥纫,有兩種情況例外:

  • macOS 或 iOS App的extensions
  • macOS中App包含在一個group中

關(guān)于這個部分有一個實際應(yīng)用。之前開發(fā)的應(yīng)用中有一個功能是收款語音播報痴奏。我采用的方案是使用app extension功能進(jìn)行開發(fā)蛀骇。其中涉及到一個需求,在主應(yīng)用中有一個控制是否播放語音的開關(guān)读拆,在extension中實現(xiàn)了合成語音并播放的功能擅憔。

  1. 開啟AppGroup


    image.png
  2. 初始化針對該group的用戶偏好文件
    NSUserDefaults *shareUserDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxxx"];
    if (![shareUserDefault boolForKey:@"FirstVoiceManagerProfile"]) {
        [shareUserDefault setBool:YES forKey:OPEN_KEY];
        [shareUserDefault setBool:YES forKey:@"FirstVoiceManagerProfile"];
    }
  1. 讀取共享用戶偏好
    //  獲取共享域的偏好設(shè)置
    NSUserDefaults *shareUserDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxxx"];
    //  解析推送自定義參數(shù)userInfo
    NSDictionary *userInfo = [self dictionaryWithUserInfo:self.bestAttemptContent.userInfo];
    BOOL canSound = [shareUserDefault boolForKey:OPEN_KEY];
    NSString *voiceString = nil;
    //
    if (canSound && userInfo) {
        voiceString = [NSString stringWithFormat:@"收款%@元!", userInfo[@"money"]];
    }

線程安全

NSUserDefaults是線程安全的檐晕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暑诸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辟灰,更是在濱河造成了極大的恐慌个榕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芥喇,死亡現(xiàn)場離奇詭異笛洛,居然都是意外死亡,警方通過查閱死者的電腦和手機乃坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沟蔑,“玉大人湿诊,你說我怎么就攤上這事∈莶模” “怎么了厅须?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長食棕。 經(jīng)常有香客問我朗和,道長错沽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任眶拉,我火速辦了婚禮千埃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忆植。我一直安慰自己放可,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布朝刊。 她就那樣靜靜地躺著耀里,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾氓。 梳的紋絲不亂的頭發(fā)上冯挎,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音咙鞍,去河邊找鬼房官。 笑死,一個胖子當(dāng)著我的面吹牛奶陈,可吹牛的內(nèi)容都是我干的易阳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃粒,長吁一口氣:“原來是場噩夢啊……” “哼潦俺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徐勃,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤事示,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后僻肖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肖爵,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年臀脏,在試婚紗的時候發(fā)現(xiàn)自己被綠了劝堪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揉稚,死狀恐怖秒啦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搀玖,我是刑警寧澤余境,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響芳来,放射性物質(zhì)發(fā)生泄漏含末。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一即舌、第九天 我趴在偏房一處隱蔽的房頂上張望佣盒。 院中可真熱鬧,春花似錦侥涵、人聲如沸沼撕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽务豺。三九已至,卻和暖如春嗦明,著一層夾襖步出監(jiān)牢的瞬間笼沥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工娶牌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奔浅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓诗良,卻偏偏與公主長得像汹桦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鉴裹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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

  • NSUserDefaults是什么舞骆,有什么用處 對于應(yīng)用來說,每個用戶都有自己的獨特偏好設(shè)置径荔,而好的應(yīng)用會讓用戶根...
    heigo閱讀 168評論 0 0
  • 對于應(yīng)用來說督禽,每個用戶都有自己的獨特偏好設(shè)置,而好的應(yīng)用會讓用戶根據(jù)喜好選擇合適的使用方式总处,把這些偏好記錄在應(yīng)用包...
    肉肉要次肉閱讀 699評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理狈惫,服務(wù)發(fā)現(xiàn),斷路器鹦马,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 歡迎關(guān)注公眾號: CodeReview 關(guān)于NSUserDefaults首先要看蘋果官方的定義 NSUserDef...
    sellse閱讀 79,280評論 16 169
  • 時間是一個偉大的作者胧谈,它會給每個人寫出完美的結(jié)局,有情懷荸频,有夢想第岖,有冒險精神的人值得所有人去感動
    張?zhí)炱嫣鞆?/span>閱讀 118評論 0 0