swift - 数据缓存一使用UserDefaults与plist表格进行数据存储

UserDefaults是iOS中提供的一套最为基础的持久化方式,一般用于存储用户的基本信息

直接上代码:

// 最简单的使用于存取

    func userDefaultsSave() -> Void {

        let user:UserDefaults = UserDefaults.standard

        /*基础的可存储的类型*/

        user.set(URL(string: "https://www.baidu.com"), forKey: "url")

        user.set("anyObject", forKey: "any")

        user.set(true, forKey: "bool")

        user.set(Double(10), forKey: "double")

        user.set(Float(10), forKey: "float")

        user.set(Int(10), forKey: "int")

        /*数据读取*/

        let url:URL = user.url(forKey: "url")!

        let any:Any = user.object(forKey: "any")!

        let bool:Bool = user.bool(forKey: "bool")

        let double:Double = user.double(forKey: "double")

        let float:Float = user.float(forKey: "float")

        let int:Int = user.integer(forKey: "int")

        print("url:\(url), any:\(any), bool:\(bool), double:\(double), float:\(float), int:\(int)")


        

 /*存储数组*/

        let array:Array<Any> = ["hello",["name":"bayMax"],["one","two","three"]]

        user.set(array, forKey: "array")

        /*存储字典*/

        let dic:Dictionary<String,Any> = 

                    ["one":"hell0","two":["he","ll","ow"],

                    "three":["name":"zhangsan","age":"30"]]

        user.set(dic, forKey: "dic")

        let getArray:Array<Any> = user.object(forKey: "array") as! Array<Any>

  let getDic:Dictionary<String,Any> = 

        user.object(forKey: "dic") as! Dictionary<String, Any>

        print("array:\(getArray), dic:\(getDic)")


        //特点:swift中是不需要手动的去添加synchronize方法

    }



UserDefaults 用于存储一些简单的数据,存储用户自定义数据时常常用到plist表格,并且对自定义数据进行归档与解归档操作

代码如下:

自定义数据

class CustomerModel:NSObject,NSCoding {

    var name:String?

    var age:Int?

    var height:Float?

    var ingoArray:Array<Any>?

    var infoDic:Dictionary<String,Any>?

    

    /*归档*/

    func encode(with aCoder: NSCoder) {

        aCoder.encode(name, forKey: "name")

        aCoder.encode(age, forKey: "age")

        aCoder.encode(height, forKey: "height")

        aCoder.encode(ingoArray, forKey: "ingoArray")

        aCoder.encode(infoDic, forKey: "infoDic")

    }

    /*解归档*/

    required init?(coder aDecoder: NSCoder) {

        super.init()

        name = aDecoder.decodeObject(forKey: "name") as? String

        age = aDecoder.decodeObject(forKey: "age") as? Int

        height = aDecoder.decodeObject(forKey: "height") as? Float

        ingoArray = aDecoder.decodeObject(forKey: "ingoArray") as? Array<Any>

        infoDic = aDecoder.decodeObject(forKey: "infoDic") as? Dictionary<String,Any>

    }

    /*初始化方法*/

    override init() {

        super.init()

    }

/*使用数据*/

/*存储自定义对象*/

    func saveCustomerData() -> Void {

        let model:CustomerModel = CustomerModel.init()

        model.name = "张三"

        model.age = 30

        model.height = 165.00

        model.ingoArray = ["1","2","3"]

        model.infoDic = ["one":"1","two":"2"]

        

        /*存储到本地*/

     var accountPath=NSSearchPathForDirectoriesInDomains

        (.documentDirectory, .userDomainMask, true).first!

        accountPath+="/userAccount.plist"        

        NSKeyedArchiver.archiveRootObject(model, toFile: accountPath)

        

        

        /*读取数据*/

        let getmodel:CustomerModel = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as! CustomerModel

        print("getmodel:\(getmodel)")


    }

一些简单的优化策略

针对于UserDefaults的存储策略

保证存储的一致性:在我们进行对去存储数据的操作过程中,往往返返的key值书写会为我们造成读取不成功的错误问题,为了避免这一问题使用全局的不可变key值去进行操作,保证了数据操作前后的一致性

分组存储策略:在进行存储过程中会遇到大量的相同key值,例如个人信息中含有id,展示数据中含有id,商品列表中含有ID,为了解决出现的不一致以及混乱问题我们可以把key值进行分组,以枚举的方式进行枚举所需要的key值

例如:

struct AccountInfoKey {

        let userName = "userName"

        let avatar = "avatar"

        let password = "password"

        let gender = "gender"

        let age = "age"

        

    }

    // 登录信息

 struct LoginInfoKey {

        let token = "token"

        let userId = "userId"

    }

    // 配置信息

 struct SettingInfoKey {

        let font = "font"

        let backgroundImage = "backgroundImage"

    }


上下文信息问题:这一问题为比如个人用户信心存储含有账号密码,登陆信息,个人配置信息等等,如果一点点的进行存储就会出现了读取不变的问题,使用结构体对零散信息进行整合,提高代理的逻辑性和清晰性

例如:

struct UserDefaultKeys {

        // 账户信息

        struct AccountInfo {

            let userName = "userName"

            let avatar = "avatar"

            let password = "password"

            let gender = "gender"

            let age = "age"

        }

        // 登录信息

        struct LoginInfo {

            let token = "token"

            let userId = "userId"

        }

        // 配置信息

        struct SettingInfo {

            let font = "font"

            let backgroundImage = "backgroundImage"

        }

    }

不初始化进行访问属性:解决进行使用创建实例的麻烦:
使用全局静态变量去设置属性,

例如:(也可以是全局动态变量)

struct AccountInfo {

        static let userName = "userName"

        static let avatar = "avatar"

        static let password = "password"

        static let gender = "gender"

        static let age = "age"

    }

枚举分组存储(分组存储的优化)

struct UserDefaultKeys {

        // 账户信息

        enum AccountInfo: String {

            case userName

            case age

        }

    }

使用是直接用枚举的形式去系统的创建key值

defaultStand.set("ChilliCheng",forKey: UserDefaultKeys.AccountInfo.userName.rawValue)




你可能感兴趣的:(oc基础)