我正在学习用于macOS开发的SwiftUI
,我想知道在创建管理器、服务等时,什么是正确的方法。这些对象与UI无关-严格来说是业务逻辑的东西,甚至不是ViewModels
。我是否应该不使用ObservableObject
、Published
、AppStorage
等对象,在这类类类中添加这些元素似乎是有益的,这样我以后就可以很容易地将它们与ViewModels
一起使用,并直接绑定到一些属性。另一方面,这似乎是错误的-就像这些属性 Package 器是严格相关的SwiftUI
。那么,我应该放弃管理器、服务和其他业务逻辑对象中的这些东西吗?
2条答案
按热度按时间qlzsbp2j1#
ObservableObject
和Published
都是在合并中定义的,所以它们可以在应用的UI层之外使用。相反,@AppStorage
是在SwiftUI中定义的,所以你应该只在View
中使用它。但是,在合并中定义了某些内容并不一定意味着它在未绑定到UI时提供了有意义的使用值。
ObservableObject
的主要用例是将对象存储为View
上的@ObservedObject
,并获得自动视图更新。尽管您可以从视图外部使用ObservableObject
提供的objectWillChange
Publisher
,但它并没有太大的用处,所以一般来说,我不建议让对象符合ObservableObject
,除非它们直接更新SwiftUI视图。另一方面,
@Published
即使在ViewModel-View交互之外也提供了重要的价值。即使在纯业务逻辑层中,观察可变状态的变化也非常有用,例如在位置管理器类中公开用户的当前位置,并从视图模型中观察它。将该属性标记为@Published
会使观察变得更加容易。分离视图应该直接访问哪些对象是一个主观的主题,所以我不会详细讨论这个问题,但是如果您希望保持视图独立于ViewModel之外的业务逻辑对象,您应该在ViewModel上存储管理器、服务等,并代理任何需要通过ViewModel更新UI的属性。您不需要使您的管理器/服务符合
ObservableObject
,但是,将可变状态存储为@Published
可能非常有用。ctehm74n2#
ObservableObject
允许您将状态存储在独立于任何视图的对象中。(或 * 收听 *)。要 * 广播 *(publish)变量的值到视图中,只需用属性 Package 器@Published
标记它们即可。显然,我认为这个模式是严格专用于对象-〉视图通信的。