Swift / iOS-视图控制器之间共享模型状态

时间:2018-10-18 15:11:24

标签: ios swift architecture

我对在View Controller之间共享模型状态有疑问。

让我们举个例子:Twitter应用程序。在时间轴提要中,您会看到状态列表,这些状态是从API加载的,序列化为模型的状态。在提要Feed中,您还可以找到状态列表。它们也从API加载,序列化为模型,但序列化为不同的实例。如果用户点击提及提要中的“心脏”按钮,则它也应在时间轴提要中显示为喜欢的推文。但这意味着共享代表相同状态更新的两个不同模型实例的状态。

我要解决此不一致状态的方法是使用状态的“缓存”。我将其作为静态属性放在状态模型中,如下所示:

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请先重新措辞。

  • 获取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或 dictionaryC,但还要维护arrayA和arrayB。但是A和B没有 保留对象的实例,而不是引用对象 arrayC或dictionaryC。这实际上只是一个实现 选项1.我有一个dictionaryC,其中key是存储在value中的对象的uuid,而数组A和B只存储了key。

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

不过,我认为您不应该继续保持不同实例的同步。