首先对于归档的定义就不再赘述
最近在做一个项目,里面有一个功能是把购物车里的产品缓存到本地,由于数据量较少,选择归档模式。
首先看一下数据模型。SSTCart对应的是购物车的model,里面包含两个元素,一个是list数组,用来存放产品,一个是购物车所有产品的totalprice。list数组里面的的产品对应的model是SSTOrderItem
步骤一:对SSTCart的model进行encode
- 遵从NSCoding协议
- 实现coding协议
required init?(coder aDecoder: NSCoder) {
super.init()
list = aDecoder.decodeObjectForKey("List") as! [SSTOrderItem]
totalPrice = aDecoder.decodeDoubleForKey("TotalPrice")
}
override init() {
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(list, forKey: "List")
aCoder.encodeDouble(totalPrice, forKey: "TotalPrice")
}
步骤二:对SSTOrderItem的model进行encode
遵从NSCoding协议
-
实现coding协议
required init?(coder aDecoder: NSCoder) {
super.init()
cartId = aDecoder.decodeObjectForKey("CartId") as! NSNumber
userId = aDecoder.decodeObjectForKey("UserId") as! NSNumber
productId = aDecoder.decodeObjectForKey("ProductId") as! NSNumber
unitPrice = aDecoder.decodeDoubleForKey("UnitPrice")
createdate = aDecoder.decodeObjectForKey("Createdate") as! String
qtyPrice = aDecoder.decodeDoubleForKey("QtyPrice")
qty = aDecoder.decodeIntegerForKey("Qty")
originUnitPrice = aDecoder.decodeDoubleForKey("OriginUnitPrice")
imagePath = aDecoder.decodeObjectForKey("ImagePath") as! String
productName = aDecoder.decodeObjectForKey("ProductName") as! String
savedMoney = aDecoder.decodeDoubleForKey("SavedMoney")} override init() { } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(cartId, forKey: "CartId") aCoder.encodeObject(userId, forKey: "UserId") aCoder.encodeObject(productId, forKey: "ProductId") aCoder.encodeDouble(unitPrice, forKey: "UnitPrice") aCoder.encodeObject(createdate, forKey: "Createdate") aCoder.encodeDouble(qtyPrice, forKey: "QtyPrice") aCoder.encodeInteger(qty, forKey: "Qty") aCoder.encodeDouble(originUnitPrice, forKey: "OriginUnitPrice") aCoder.encodeObject(imagePath, forKey: "ImagePath") aCoder.encodeObject(productName, forKey: "ProductName") aCoder.encodeDouble(savedMoney, forKey: "SavedMoney") }
这样两个model的encoding算是实现了
步骤三:归档和解档的方法
自己写了一个文件的读写的class
在这个class里面的代码如下:
static func getFilePath(filePath: String) -> String? {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.AllDomainsMask, true)
if paths.count > 0 {
return "\(paths[0])/"+filePath
}
return nil
}
//MARK: 归档的方法
static func archive(fileName: String, object: NSObject) -> Bool {
let name = getFilePath(fileName)!
return NSKeyedArchiver.archiveRootObject(object, toFile: name )
}
//MARK: 解档的方法
static func unarchive(fileName: String) -> AnyObject? {
return NSKeyedUnarchiver.unarchiveObjectWithFile(getFilePath(fileName)!)
}
步骤四:把请求得到的购物车数据进行归档
代码如下:
if FileOP.archive(kShoppingCartFileName, object: tmpSelf!.shoppingCart){
print("add to file success")
} else {
print("add to file failure!")
}
其中,tmpSelf!.shoppingCart是从网络请求之后得到的数据。
至此,归档操作已经完成,如果需要解档操作的话,直接调用 unarchiver方法即可。