45-Swift之UserDefaults数据存储

一、NSUserDefaults && UserDefaults 的介绍

NSUserDefaults或者UserDefaults是一个分层的持续进程间分布(可选)键值存储优化存储用户设置。

二 、 UserDefaults 的使用和方法介绍

1 、 UserDefaults的初始化

/**
 创建一个对象
 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、 存储各个类型的数据

/**
 存储数据函数
 open func set(_ value: Any, forKey defaultName: String)
 */
/**
 String 类型存储数据
 */
let NWString = "NetWork小贱"
let NWStringKey = "StringKey"
NwUserDefaults.set(NWString, forKey: NWStringKey)

/**
 Bool 类型存储数据
 */
let NWBool = true
let NWBoolKey = "BoolKey"
NwUserDefaults.set(NWBool, forKey: NWBoolKey)

/**
 Array 类型存储
 */
let NWArray = ["110","119"]
let NWArrayKey = "ArrayKey"
NwUserDefaults.set(NWArray, forKey: NWArrayKey)

/**
 Dictionary 类型存储
 */
let NWDictionary = ["A":"110","B":"120"]
let NWDictionaryKey = "DictionaryKey"
NwUserDefaults.set(NWDictionary, forKey: NWDictionaryKey)

/**
 Data 类型存储
 */
let NWData = Data.init(base64Encoded: "NetWork")
let NWDataKey = "DataKey"
NwUserDefaults.set(NWData, forKey: NWDataKey)

/**
 NSInteger 类型存储
 */
let NWNSInteger = 2
let NWNSIntegerKey = "NSIntegerKey"
NwUserDefaults.set(NWNSInteger, forKey: NWNSIntegerKey)

/**
 Float 类型存储
 */
let NWFloat = 1.0
let NWFloatKey = "FloatKey"
NwUserDefaults.set(NWFloat, forKey: NWFloatKey)

/**
 Double 类型存储
 */
let NWDouble = 1.000000
let NWDoubleKey = "DoubleKey"
NwUserDefaults.set(NWDouble, forKey: NWDoubleKey)

/**
 URL 类型存储
 */
let NWURL = URL.init(string: "http://www.jianshu.com/u/23dd8d9701bf")
let NWURLKey = "URLKey"
NwUserDefaults.set(NWURL, forKey: NWURLKey)

3、将存储的数据同步磁盘

/**
 同步到磁盘
 */
NwUserDefaults.synchronize()

4 、 获取各个类型的存储数据

/**
 获取值
 常用的函数:
 open func object(forKey defaultName: String) -> Any?
 */
var UserDefaultValue : Any

UserDefaultValue   = NwUserDefaults.object(forKey: NWStringKey) as Any
print(UserDefaultValue as! String)
/**
 如果知道获取数据的类型,就可以指定函数获取其值
 
 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、 移除一个存储的数据

/**
 要从存储中移除某个对象
 */
NwUserDefaults.removeObject(forKey: NWBoolKey)

6、向注册域设置数据

1、register 函数的介绍

register 函数介绍
该方法是添加一个具体的字典到注册域。UserDefaults数据库中其实是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。并且它默认会包含5 个 Domain, 分别是:
NSArgumentDomain: 参数域,有最高优先权。
Application: 应用域(application domain)是最重要的域,它存储着你app通过UserDefaults set...forKey添加的设置。
NSGlobalDomain:全局域(global domain)则存储着系统的设置。
Languages: 语言域(language-specific domains)则包括地区、日期等。
NSRegistrationDomain: 注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。

从上面 5 个Domain 的介绍上看出,我们经常使用的 open func set(_ value: Any, forKey defaultName: String) 该函数是将数据存储在 Application Domain 下,同时持久保存数据。而 open func register(defaults registrationDictionary: [String : Any]) 该函数是将数据存储到 NSRegistrationDomain 下,同时不是持久保存。

注意: 平时我们获取数据的时候,实际上会在底层的存储结构中进行一次搜索,属性搜索过程就是这样:NSArgumentDomain -> Application -> NSGlobalDomain -> Languages -> NSRegistrationDomain,则对于注册的优先级是最低的。

2、 register 函数的使用
/**
 register 的测试
 */
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、数据共享增加套件

/**
 添加套件
 套件的作用: 是实现App与App之间的数据共享
 */
NwUserDefaults.addSuite(named: "NetWork")
/**
 移除套件
 */
NwUserDefaults.removeSuite(named: "NetWork")

8、在自定义的域名下存储数据

/**
 设置到自己定义的域名下,存储数据
 */
NwUserDefaults.setPersistentDomain(["Ak":"47"], forName: "AK47")
/**
 获取数据
 */
let DomainDictionary = NwUserDefaults.persistentDomain(forName: "AK47")
print(DomainDictionary!)
/**
 移除自定义的域名
 */
NwUserDefaults.removePersistentDomain(forName: "AK47")

9、检测给定的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)

参数域
print(UserDefaults.argumentDomain)

 注册域
print(UserDefaults.registrationDomain)

11、 UserDefaults 添加监控

/**
 添加监控
 */
/**
 UserDefault 只要发生变动(数据添加,删除,替换等),就能触发该通知。
 */
NotificationCenter.default.addObserver(self, selector: #selector(didChangeUserDefault), name:UserDefaults.didChangeNotification, object: NwUserDefaults)

方法实现:

func didChangeUserDefault() -> Void {
    print("用户移除Double存储数据")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容