45-Swift之UserDefaults数据存储
2017-07-13 本文已影响180人
NetWork小贱
一、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存储数据")
}