SwiftUI 视图模型中存在什么样的数据引用?

问题描述 投票:0回答:1

这不仅仅是一个哲学问题;这是一个哲学问题。这是一个真正的设计问题。我正在努力解决如何向 UI 公开应用程序的中央数据模型。

无论您想如何称呼它们,处理视图呈现的数据结构的对象都应该代理视图中用户操作导致的数据模型更改。并且视图始终应该显示“实时”数据,即使所述数据在后台更新。

举这个简单的例子:

那么这在 SwiftUI 中应该如何实现呢?可能有一个进程在后台大量下载消息,更新数据模型。

不要纠结于这里的特定数据类型。我可能正在谈论用户正在查看用户对象的表示时发生的更改。

偶尔会加剧困难的是 SwiftUI 只能监视值类型的更改;从类(非结构)子对象发布的更改不会传播到父对象之外。

在 SwiftUI 教程中,Apple 宣扬了“唯一事实来源”的想法,但考虑到 UI 和中央模型之间需要有一个代理,我看不出如何实现这一点。将 UI 直接绑定到中央数据模型显然是不可取的,因为中央数据模型是唯一的事实来源。那么...我在这里错过了什么?

跟进一些评论:我没有使用 CoreData 等,因为这需要跨平台移植,并且我想避免像这样的专有绑定。而且我的目标是 iOS 15+。

在我看来,我需要重新使用通知或委托模式来提醒所有视图模型中央模型已更改。那么viewmodels会怎样呢?切换自身内部的标志来触发 UI 刷新?它会从什么刷新?视图模型中的包装函数从中心模型中提取数据?

swiftui mvvm
1个回答
0
投票

在 SwiftUI 中,View 结构就是视图模型,您不需要单独的对象。视图结构创建对模型数据的依赖关系,只要模型数据发生更改,就会调用主体,从而创建新的视图结构层次结构。由于视图结构是值,因此重新生成此层次结构在性能方面可以忽略不计(只要您不犯任何错误,例如初始化堆对象)。然后 SwiftUI 比较结构层次结构并使用结果自动为您初始化实际视图层,即它初始化/取消初始化/更新 UIKit UIView 对象,选择最适合平台的对象。如果您尝试使用视图模型对象重新实现其中的一些内容,那么您就会遇到性能问题和一致性错误。

你质疑单一事实来源是否是一个好主意,这是正确的,许多遇到问题的人也开始质疑这一点。

© www.soinside.com 2019 - 2024. All rights reserved.