NSManagedObjectはObservableObjectだから、SwiftUIのObservedObjectで監視できる
Table of Contents
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で渡すのが良さそうではある。