繁体   English   中英

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

[英]Swift/iOS - Sharing Model State between View Controllers

我有一个关于在View Controller之间共享模型状态的问题。

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

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

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

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

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

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

只是先改一下。

  • 获取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的实现。我有一个dictionary C,其中key是存储在value中的对象的uuid,而数组A和B仅存储了key。

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

我不认为您应该坚持保持不同实例同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM