iOS 文件缓存(NSKeyedArchiver、Codabel、)

在使用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,他们都不用这种方式本地化存储的吗,有的话这个问题是怎样解决的,网上没有搜到答案真是让人头大。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,156评论 1 32
  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 2,792评论 2 10
  • 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e2...
    笔笔请求阅读 567评论 0 0
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 537评论 0 0
  • 今天是学习《创伤与复原》第十三天。首先让我们共同欣赏作者的一段实在太精彩的描述:长期性创伤后应激障碍中的过度警觉和...
    天马丽人行阅读 157评论 0 1