SwiftUI @State、@ObservedObject 和 @EnvironmentObject 之间有什么区别?

@State属于单个视图的简单属性。它们通常应该被标记private

@State对于属于特定视图并且永远不会在该视图之外使用,因此将这些属性标记为私有非常重要,以重新强化这种状态是专门设计为永远不会逃避其视图的想法。

为什么用@ObservedObject

对于更复杂的属性——当你想要使用一个可能有多个属性和方法的自定义类型,或者可能在多个视图之间共享时——你会经常使用它@ObservedObject

这与@State现在我们使用外部引用类型而不是像字符串或整数这样的简单本地属性非常相似。你仍然说你的视图依赖于会改变的数据,除了现在是你自己负责管理的数据——你需要创建一个类的实例,创建它自己的属性,等等。

无论您使用什么类型,@ObservedObject都应该符合ObservableObject协议。当您向可观察对象添加属性时,您可以决定对每个属性的更改是否应该强制正在观察您的对象的视图刷新。您通常会这样做,但这不是必需的。

观察对象有多种方法可以通知视图重要数据已更改,但最简单的方法是使用@Published属性包装器。如果您需要更多控制,您还可以使用来自组合框架的自定义发布者,但实际上这种情况非常少见。如果可观察对象碰巧有多个视图使用其数据,则任一选项都会自动通知所有视图。

警告:当您使用自定义发布者来宣布您的对象已更改时,这必须发生在主线程上。

为什么用@StateObject

介于@State@ObservedObject之间的某个地方@StateObject。这是 的一个特殊版本@ObservedObject,它的工作方式几乎完全相同:您必须遵守ObservableObject协议,您可以使用@Published将属性标记为导致更改通知,并且当对象更改时,任何观看 an 的视图@StateObject都将刷新其主体。

@StateObject和之间有一个重要区别@ObservedObject,即所有权——哪个视图创建了对象,哪个视图只是在观察它。

规则是这样的:无论哪个视图首先创建您的对象,都必须使用@StateObject,告诉 SwiftUI 它是数据的所有者,并负责保持数据的存活。所有其他视图必须使用@ObservedObject, 来告诉 SwiftUI 他们想要观察对象的变化,但不直接拥有它。

为什么用@EnvironmentObject?

解了如何@State为一个类型声明简单属性以在视图更改时自动刷新视图,以及如何@ObservedObject为外部类型声明一个在视图更改时可能会或可能不会导致刷新视图的属性。这两个都必须由您的视图设置,但@ObservedObject可能与其他视图共享。

还有另一种类型的属性包装器可供使用,即@EnvironmentObject. 这是一个通过应用程序本身提供给视图的值——它是每个视图都可以读取的共享数据。因此,如果您的应用程序有一些所有视图都需要读取的重要模型数据,您可以将它从一个视图传递到另一个视图,或者将它放入每个视图都可以即时访问它的环境中。

@EnvironmentObject当您需要在应用程序中传递大量数据时,可以将其视为一种巨大的便利。因为所有视图都指向同一个模型,所以如果一个视图更改了模型,所有视图都会立即更新——不存在让您的应用程序的不同部分不同步的风险。

转载:https://www.hackingwithswift.com/quick-start/swiftui/whats-the-difference-between-observedobject-state-and-environmentobject

你可能感兴趣的:(Swift,iOS,swiftui,ios,swift)