swift数据持久化之属性列表,解决plist写入失败的问题

9 篇文章 0 订阅

属性列表作为一种数据持久化一种办法,被我们广泛的使用,相比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)

    }




    }

}
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值