在使用swift5进行对象的硬盘缓存时,遇到问题不明白,做简单记录。
环境在OC中, 对象实现NSCoding协议,使用NSKeyedArchiver进行对象解归档即可,也未遇到什么问题。(实际应用更简单,使用MJExtension,这个库为model做了很多事情)
swift中,项目中对象都是struct,而NSCoding协议需要继承NSObject,而在swift4为我们提供了Codable协议遵循(发现这点后,我将项目中的SwiftJSON替换掉了)使用起来也很是简单:(当然这也是最简单的情况,暂时只考虑与后台匹配的情况)
model将后台传回的data转为对象:
self.model =tryJSONDecoder().decode(User.self, from: modelData)
而在使用NSKeyedArchived时,发现依然不能直接归档对象(不太明白),Codable 说好无缝接入的呢
- 将对象archiveData传入:
对象归档到文件-将对象data直接写入文件:
对象编码保存到文件这两种方式都是将对象的data类型保存到文件中,但是转换为data的方式不同
直接encode保存在文件中的是对象的data string,而NSKeyedArchiver.archivedData(withRootObject: user, requiringSecureCoding:false)会报错
__SwiftValue encodeWithCoder:]: unrecognized selector很明显只有class才可以遵循NSCoding然后使用NSKeyedArchive
NSKeyedArchive 实际是将对象保存在plist中 我不太明白直接将对象的data string保存在文件与archive到plist中有什么劣势呢,实际上直接写入文件比plist占用空间小。将model转为Data倒是可以archive ,但这样是否有意义。要不要将model改为class不再使用struct。我看到网上swift建议使用struct来定义model,他们都不用这种方式本地化存储的吗,有的话这个问题是怎样解决的,网上没有搜到答案真是让人头大。
网友评论