本文是「打造强大的BaseModel」的篇三篇,第一篇文章请见此:让Model自我描述 。第二篇文章请见此:让Model自动转换。相对于让Model实现自我描述和自动转换,让Model实现自动归档会难一点(事实后来我发现一点也不难)。我相信能够好好看完这三篇文章的人,绝对是有大收获的。
什么是iOS的归档
归档–NSKeyedArchiver,是iOS开发中基本的数据存储方式之一,和其他的数据存储方式相比,归档不仅能够存储任意类型的数据,而且使用起来也很简单。归档能将数据处理成NSData的形式,所以很容易以文件的形式保存在APP的沙盒中,而解归和归档相反,它是将保存在APP沙盒的归档文件逆归档,转换成归档前的状态。
传统的iOS归档方式
要想让一个自定义对象可以使用归档,必须要让其符合NSCoding协议,
1 2 3 4 5 |
public protocol NSCoding { public func encodeWithCoder(aCoder: NSCoder) public init?(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER } @end |
上面的代码是iOS中NSCoding协议的定义。里面包含两个方法,其中一个是构造器。第一个方法
1 |
public func encodeWithCoder(aCoder: NSCoder) |
就是归档方法,它是为了告诉NSKeyedArchiver对象如何将数据归档成文件的。第二个方法(构造器)
1 |
public init?(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER |
就是解档方法了。它是告诉NSKeyedUnArchiver是如何将归档好的对象解档成原来的数据的
下面来看看传统的iOS归档方式,先定义一个类,让其符合NSCoding协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class DemoArchiver:GrandModel,NSCoding { var demoString:String? var demoInt = 100 var demoFloat:Float = 0.0 var demoDate = NSDate() required init(){ } @objc func encodeWithCoder(aCoder: NSCoder) {//归档需要实现的方法 aCoder.encodeObject(demoString, forKey: "demoString") aCoder.encodeInteger(demoInt, forKey: "demoInt") aCoder.encodeFloat(demoFloat, forKey: "demoFloat") aCoder.encodeObject(demoDate, forKey: "demoDate") } @objc required init?(coder aDecoder: NSCoder) {//解档需要实现的构造器 demoString = aDecoder.decodeObjectForKey("demoString") as? String demoInt = aDecoder.decodeIntegerForKey("demoInt") demoFloat = aDecoder.decodeFloatForKey("demoFloat") demoDate = aDecoder.decodeObjectForKey("demoDate") as! NSDate //存在强制转换情况 } } |
我们需要在正确地重写这两个方法。这里面最需要注意的点有两个,一是不要把数据类型搞错。二是key名不要弄错了。然后下面开始测试
1 2 3 4 5 6 7 8 9 10 |
let demoTest = DemoArchiver() demoTest.demoString = "ABCDEFG" demoTest.demoFloat = 11.11 print(demoTest) let a = NSKeyedArchiver.archivedDataWithRootObject(demoTest) let b = NSKeyedUnarchiver.unarchiveObjectWithData(a) print(b) //打印结果 **DemoArchiver:["demoInt": 100, "demoString": ABCDEFG, "demoFloat": 11.11, "demoDate": 2016-03-09 13:03:17 +0000] Optional(DemoArchiver:["demoInt"span>+0000] Optional(DemoArchiver:["demoInt"84753/" target="_blank">让Model自动转换。相对于让Model实现自我描述和自动转换,让Model实现自动归档会难一点(事实后来我发现一点也不难)。我相信能够好好看完这三篇文章的人,绝对是有大收获的。
什么是iOS的归档归档–NSKeyedArchiver,是iOS开发中基本的数据存储方式之一,和其他的数据存储方式相比,归档不仅能够存储任意类型的数据,而且使用起来也很简单。归档能将数据处理成NSData的形式,所以很容易以文件的形式保存在APP的沙盒中,而解归和归档相反,它是将保存在APP沙盒的归档文件逆归档,转换成归档前的状态。 传统的iOS归档方式要想让一个自定义对象可以使用归档,必须要让其符合NSCoding协议,
上面的代码是iOS中NSCoding协议的定义。里面包含两个方法,其中一个是构造器。第一个方法
就是归档方法,它是为了告诉NSKeyedArchiver对象如何将数据归档成文件的。第二个方法(构造器)
就是解档方法了。它是告诉NSKeyedUnArchiver是如何将归档好的对象解档成原来的数据的
我们需要在正确地重写这两个方法。这里面最需要注意的点有两个,一是不要把数据类型搞错。二是key名不要弄错了。然后下面开始测试
|