属性列表作为一种数据持久化一种办法,被我们广泛的使用,相比NSUUSERDEFAULT,它的实用性更加的广泛,但是属性列表还是有一些坑的,主要属性列表只能对NSDATA,NSDICITONARY,NSARRAY进行存储,但是对swift的数组,和字典和有一些局限,从而造成写入不成功的现象,楼主也为这个折腾一下午,在这里分享一下swift下的属性列表的使用。本文代码全部基于swift3.0编写。
先解释一下下面的代码的应用,场景,在项目中药加载一个三级联动的地址选择框,当然我们给他缓存起来,因为从网络请求解析后数据是一个数组,怎样将这个字典数组,用偏好设置显然不行,直接用属性列表写到plist会崩溃。
import UIKit
import CoreFoundation
class SHPickTool: NSObject {
lazy var fileManger:FileManager=FileManager.default
class func getPickData(finishCallBack:@escaping (_ result: AnyObject)->()){
let filePath:String = NSHomeDirectory() + "/Documents/address.plist"
//先判断一下,DOcument文件夹下有没有plist文件,如果有将装成nsdata,在转成数组,通过闭包传出去。
if (FileManager.default.fileExists(atPath: filePath)) {
let contentData:NSData = try! NSData.init(contentsOfFile: filePath)
let contentA:NSArray = NSKeyedUnarchiver.unarchiveObject(with: contentData as Data) as! NSArray
let dic :[[String:AnyObject]] = contentA as! [[String : AnyObject]]
finishCallBack(dic as AnyObject)
}else{
NetworkToolRequest.selectAllArea(params: ["":"" as AnyObject]) { (response) in
guard let resultDic = response as? [String:AnyObject] else{
return
}
guard let modelDic = resultDic["data"] as? [[String:AnyObject]] else{
return
}
let CHINADIc = modelDic[0] as [String:AnyObject]
//provinceDic是一个字典数组,因为数组中的字典不是NSDictiOnary类型,直接写入,会报错。
guard let provinceDic = CHINADIc["children"] as? [[String:AnyObject]] else{
return
}
//将字典数组缓存起来
saveData(array1: provinceDic)
finishCallBack(provinceDic as AnyObject)
}
}
}
class func saveData(array1: [[String:AnyObject]]){
DispatchQueue.global().async {
let filePath:String = NSHomeDirectory() + "/Documents/address.plist"
//重点在这里将Array转成NSArray
let array2:NSArray = array1 as NSArray
//将NSArray转成NSDATA,然后将NSDATA写入到plist中,具体怎么写的请看下面的代码
let a:NSData = NSKeyedArchiver.archivedData(withRootObject: array2) as NSData
let fileManager = FileManager.default
let isLocalDataExisted = fileManager.fileExists(atPath: filePath)
if !isLocalDataExisted {
fileManager.createFile(atPath: filePath, contents: nil, attributes: nil)
}
print("存储路劲----"+filePath)
// let a :NSArray = [["dkdf":123],["dfjksl":"fndkjfk"]]
let b = a.write(toFile: filePath, atomically: true)
print(b)
}
}
}
“`