【问题标题】:Cache Array of Custom Objects in Swift3在 Swift3 中缓存自定义对象数组
【发布时间】:2016-12-28 21:33:12
【问题描述】:

我需要为用户在会话之间保留一组自定义对象。该数组将填充 1-14 个相当简单和轻量级的自定义 swift 对象,如下所示:

[Obj1, Obj2, Obj3]

我想做的是当viewWillDisappear 被调用时,保存这些数据,这样当用户回到屏幕时,我可以再次使用这些精确的对象。做这个的最好方式是什么?我已经研究过使用核心数据,但我不想为这些对象设置数据模型,只是按原样存储它们,没有任何关系或任何东西。

请注意,该应用使用了一种计算量很大的算法,其中这些对象起着核心作用。因此,我需要让这些物体尽可能轻。因此,我不想让对象符合 NSCoding,因为它不是对象的中心角色所必需的

【问题讨论】:

  • "请注意,由于各种原因,这些对象不适合存储在 NSUserdefaults 中。"我很想听听这些,因为那将是我的首选解决方案
  • 你可以使用 NSCoding + NSKeyedArchiver
  • 使用NSCoding,在此处查看类似的方法:Writing swift dictionary to file
  • @亚历山大。在回答您的问题时,该应用程序使用了一种计算量很大的算法,其中这些对象起着核心作用。因此,我需要让这些物体尽可能轻。因此,我不想让对象符合 NSCoding,因为它不是对象的中心角色所必需的。
  • @JamesStonehill 您可以创建一个仅用于存储的 NSCoding 子类,并使您当前的轻量级 Swift 对象具有一个接受容器对象的初始化程序。

标签: ios swift caching swift3 persistence


【解决方案1】:

如果使您的类成为符合 NSCoding 的 Objective-C 类证明实际上会产生重大的性能影响(我对此持怀疑态度),那么您可以创建第二个容器,它是 NSCoding 的子类,仅用于存储.向您当前的轻量级 Swift 类/结构添加一个初始化器,用于从该容器对象初始化实例,反之亦然。任何时候你需要序列化/反序列化,你只需使用这个容器对象作为中间对象。

这可以在读/写时以最低成本为您购买功能,但不影响常规使用性能。

【讨论】:

  • NSCoding 之上添加另一层如何提高性能?我不确定我是否理解为什么要这样做。
  • @sbooth Objective C 类总是使用动态调度。编译器无法内联任何方法、修剪未使用的代码或进行任何需要“查看”方法调用的优化。
  • @sbooth 因此,由于这种额外的中间人逻辑,在对象被序列化/反序列化的任何时候受到打击可能是有益的,但随后会在其余时间受益于更快的性能
【解决方案2】:

如果您可以使对象成为 NSObject 的子类,那么您可以使其符合 NSCoding 并使用 NSKeyedArchiver 和 NSKeyedUnarchiver 来序列化和反序列化您的对象。

【讨论】:

  • 见我上面对亚历山大的回复。
猜你喜欢
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多