Difference between @StateObject and @ObservedObject on SwiftUI
Both @StateObject and @ObservedObject are SwiftUI property wrappers used to manage state for reference types.
They allow your SwiftUI views to react and re-render when changes occur in the observed object's published properties(@Published)
However, their fundamental difference lies in their ownership and lifecycle management within the SwiftUI view hierarchy.
@StateObject
Purpose:
To create and own an instance of an ObservableObject within a view.
Lifecycle:
- When a view declares a @StateObject, SwiftUI takes responsibility for creating that instance and keeping it alive for the entire lifetime of the view, regardless of whether the view itself is redrawn or recreated.
- The object is instantiated only once when the view is first created.
- It's ideal for data models that are unique to a single view or are the source of truth for a portion of your app's state
Use Cases:
- When a view needs to manage its own complex state that can be encapsulated in an ObservableObject.
- A view that manages a data store for its subviews.
- A view that fetches data from a network or database and holds that data.
- When an object needs to persist its state even if the view's body is recomputed multiple times.
@ObservedObject
Purpose:
To observe an instance of an ObservableObject that is created and owned elsewhere.
Lifecycle:
- When a view declares an @ObservedObject, it expects to receive an existing instance of the ObservableObject from its environment or as a parameter.
- SwiftUI does not manage the lifecycle of the object itself. If the view is recreated, the @ObservedObject will point to the new instance, potentially losing state from the previous one.
- If the object changes to a different instance of the same type, SwiftUI will treat it as a new object, and the view will observe the new instance.
Use Cases:
- When passing an ObservableObject down the view hierarchy to a child view.
- When a child view needs to observe changes to an object that's managed by its parent or a shared data store.
- To share an ObservableObject that's already owned by a @StateObject or @EnvironmentObject in an ancestor view.
0 댓글