Skip to main content
  1. Posts/

NSManagedObjectはObservableObjectだから、SwiftUIのObservedObjectで監視できる

SwiftUIの@ObservedObjectは、@StateObjectのインスタンスを子View側にバインドするためのものだと思っていた。 StateObjectで管理されているものしか、ObservedObjectにできないと思っていた。 そうじゃなかった。

ObservedObjectの役割と勘違い #

ObservedObject | Apple Developer Documentation

ObservedObjectは、実行するプログラム内のどこかに存在する@Observableが付いたクラスのインスタンスや、ObservableObjectに準拠したクラスのインスタンスの変更を監視し、変更があったときにはViewを更新するためのProperty Wrapper。

@MainActor @propertyWrapper @preconcurrency @frozen
struct ObservedObject<ObjectType> where ObjectType : ObservableObject

ドキュメントのOverviewでは、「subviewにStateObjectをパスするために、これをする」とある。

You typically do this to pass a StateObject into a subview.

ObservableObjectのプロパティの変化でViewを更新したいときに、Viewのプロパティに@ObservedObjectをつけて渡すことは、サンプルでも示されている。

StateObjectとObservedObjectが、必ず対になるものと勘違いしていた。

StateObjectじゃなくても、ObservedObjectで変更を監視できる #

StateObjectで管理されていなくても、ObservableObjectであれば値の変更を監視できる。 Core DataのNSManagedObjectは、ObservableObjectに準拠しているので、@ObservedObjectのプロパティで変更を監視できる。 NSManagedObject | Apple Developer Documentation

スレッドは大丈夫なんだろうか……? ObservedObject自体にMainActorがついているから、大丈夫か。

Viewが深くなるなら、EnvironmentObjectで渡すのが良さそうではある。