首页 > 解决方案 > Swift 性能问题:从内存中的数据库加载反序列化对象或在更新 db 条目时执行序列化/反序列化

问题描述

我正在使用 sqlite 数据库来存储用户创建的应用程序内容。由于用户可以选择添加和编辑不限数量的不同对象,例如 testfields 或 imageviews,我使用序列化 JSON 作为字符串存储在 sqlite 数据库中。

我的 VC 层次结构看起来有点像这样简化:

ViewController
|- ScrollView
   |- UIView 1 - representing one content item
      |- TextField - content element 1
      |- TextField - content element 2
      |- TextField ...
      |- ImageView ...
      |- ImageView ...
      |- potential other views
      |- ...
   |- UIView 2 ...       

现在的问题是,跟踪和更新这些对象的变化(内存和速度方面)的最佳性能模式是什么。我想出了两种可能的模式:

  1. 在其中一个内容项 UIView 中创建的EveryTextFieldImageView是一个特定的子类,它获取将所有内容元素作为属性保存的反序列化 JSON 内容项。在相应的编辑功能上,它会更新反序列化的 JSON 对象,再次对其进行序列化并更新数据库条目。问题是:所有其他内容元素对象也需要获取更新的反序列化 JSON,并且NotificationCenter需要类似消息的东西来发送更新的对象。此外,对于很多对象,它们都会将整个反序列化的 JSON 对象保存在内存中。

  2. EveryTextFieldImageView仅包含对内容项 ID 的引用,并且在元素更新时,内容元素将从 sqlite db 获取具有相应 ID 的内容项,对其进行反序列化、更新、再次序列化并更新数据库条目。潜在问题:每个过程的整个过程select query -> deserialize -> update object -> serialize -> update query可能会花费太长时间(例如 UI 滞后)?

有没有更好的模式呢?

标签: iosjsonswiftserialization

解决方案


推荐阅读