【问题标题】:Swift/iOS - Sharing Model State between View ControllersSwift/iOS - 在视图控制器之间共享模型状态
【发布时间】:2019-03-23 10:48:27
【问题描述】:

我有一个关于在视图控制器之间共享模型状态的问题。

让我们举个例子:Twitter 应用程序。在时间线提要中,您会看到从 API 加载并序列化为模型的状态列表。在提及提要中,您还有一个状态列表。它们也从 API 加载,序列化为模型,但作为不同的实例。如果用户点击提及提要上的心形按钮,它也应该在时间线提要中显示为喜欢的推文。但这意味着共享代表相同状态更新的两个不同模型实例的状态。

解决这种不一致状态的方法是使用状态的“缓存”。我会将它作为静态属性放入 Status 模型中,如下所示:

static var cache: Array<Status> = Array<Status>()

并使用辅助方法始终为每个帖子使用单个实例,无论它们是从哪个视图控制器加载/修改的。

这是反模式吗?有更好的方法吗?

【问题讨论】:

  • 你使用 Core Data 吗?然后有一个简单的解决方案。
  • @Andreas 在这个例子中,在我的例子中,没有。考虑到推文和状态更新的时间敏感性(在我的情况下),我只是从 API 加载数据并存储它没有多大意义。出于好奇,Core Data 将如何解决这个问题?
  • 在 CoreData 你有:NSFetchedResultsController + NSFetchedResultsControllerDelegate。然后,您会收到有关对对象所做的任何更改的通知。
  • 你在使用 Twitter API 吗?构建类似 Twitter 的应用程序?您提到“如果用户点击提及提要上的心形按钮,它也应该在时间线提要中显示为喜欢的推文。”您是在调用 API 来更新点赞的推文,还是在用户重启手机或应用强制退出时“点赞”丢失?

标签: ios swift architecture


【解决方案1】:

只是先重新措辞。

  • 获取 API A 返回 arrayA[ X, Y, Z]
  • 获取 API B 返回 arrayB[M, Y, F]
  • 视图控制器 A 显示数组 A
  • 视图控制器 B 显示数组 B
  • 对象未持久化

用户在视图控制器 A 中修改了 Y,但视图控制器 B 没有显示更新。

  • 选项 1:将所有对象放入一个数组中,并添加一种机制来知道 应该显示在 A 和 B 视图控制器中
  • 选项 2:当任一阵列发生更新时,如果出现以下情况,则更新其他阵列 元素存在
  • 选项 3:获取 API A 和获取 API B 处理程序将结果存储在 arrayC 或 字典C,还要维护arrayA和arrayB。但是 A 和 B 没有 不再保存对象的实例,而不是对对象的引用 数组C 或字典C。这实际上只是一个实现 选项 1。我有一个字典 C,其中 key 是存储在值中的对象的 uuid,数组 A 和 B 只存储键。

当然还有其他选项,例如发送通知以便其他视图控制器知道刷新数据。

我认为您不应该走上让不同实例保持同步的道路。

【讨论】:

    【解决方案2】:

    如果我没记错 Twitter 使用 Firebase,那么自动更新只是感谢实时观察数据库。您可能应该考虑观察对象的变化并适当地更新您的视图所基于的集合。不过我不知道你的确切架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多