Preference 使用讲解
Preference简单介绍
Preference是IOS实现数据持久化的一种方式。
- 存储位置:Library/Preference
- 存储格式:key-value
- 存储类型:后面详细介绍
- 用途:保存应用的偏好设置(类似Android的SharedPreference)
- 注意:iTunes同步设备时会备份该目录。
使用介绍
官方为我们提供了UserDefaults类,可以很方便的存取数据。
获取UserDefaults实例
var userDefault = UserDefaults.standard;
存数据
userDefault.set(value, forKey: "key"); /* 立即同步,保存数据 如果不调用synchronize()方法的花,系统会根据I/O情况不定时刻的保存到文件,所以如果想要立即保存数据的话,需要调用synchronize() */ userDefault.synchronize();
读数据
let value1 = userDefault.string(forKey: "key1")!; let value2 = userDefault.integer(forKey: "key2");
支持存储的数据类型
1. 系统定义的数据类型
- 支持:
String、 Number、Date、 Array、Dictionary、Bool、Integer、Float
等系统定义的数据类型 - 存取方式:直接使用UserDefaults的
set(value: xxx, forKey: String)
方法进行存储。
2. 自定义类型
自定义的数据类型需要 转换成Data,再使用UserDefaults的set(Any?, forKey: String)
方法进行存储。
那么怎样将自定义的类和Data类型相互转换呢?
自定义类实现NSCoding协议
NSCoding协议有两个方法:
init?(coder aDecoder: NSCoder)
encode(with aCoder: NSCoder)
//解码 required init?(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObject(forKey: "name") as! String; self.age = aDecoder.decodeInteger(forKey: "age"); } //编码:key-value形式 func encode(with aCoder: NSCoder) { aCoder.encode(name, forKey: "name"); aCoder.encode(age, forKey: "age"); }
实现了NSCoding协议后,该类便可转换成Data类型
- 自定义类转 Data:
NSKeyedArchiver.archivedData(withRootObject: youClass);
- Data 转自定义类:
NSKeyedUnarchiver.unarchiveObject(with: data) as! youClass;
- 自定义类转 Data:
将自定义类转换成Data类型后,便可使用UserDefaults的
set(Any?,forKey: String)
方法进行存储了。userDefault.set(data, forKey: "history");
同样,使用UserDefaults的
data(forKey: String)
来获取数据。let data = userDefault.data(forKey: "history");