← 메인으로

0815-1 Observable, State 객체

상태 프로퍼티는 뷰의 상태를 저장하는 방법을 제공하며 해당 뷰에만 사용할 수 있다. 즉, 하위 뷰가 아니거나 State 바인딩이 구현되어 있지 않은 뷰는 접근할 수 없다.

상태 프로퍼티는 일시적인 것이어서 부모 뷰가 사라지면 그 상태도 사라진다. 반면 Observable 객체는 여러 다른 뷰들이 외부에서 접근할 수 있는 지속적인 데이터를 표현하기 위해 사용된다.

Observable 객체는 ObservableObject 프로토콜을 따르는 클래스나 구조체 형태를 취한다. Observable 객체는 데이터의 특성과 출처에 따라 앱마다 다르겠지만, 일반적으로는 시간에 따라 변경되는 하나 이상의 데이터 값을 모으고 관리하는 역할을 담당한다. 또한, Observable 객체는 타이머나 알림과 같은 이벤트를 처리하기 위해 사용될 수도 있다.

Observable 객체는 게시된 프로퍼티로서 데이터 값을 게시한다. 그런 다음, Observer 객체는 게시자를 구독하여 게시된 프로퍼티가 변경될 때마다 업데이트를 받는다. 앞에서 설명한 상태 프로퍼티처럼, 게시된 프로퍼티와의 바인딩을 통해 Observable 객체에 저장된 데이터가 변경됨을 반영하기 위해 SwiftUI 뷰는 자동으로 업데이트될 것이다.

실제로 Observable 객체의 게시된 프로퍼티를 구현하는 가장 쉬운 방법은 프로퍼티를 선언할 때 @Published 프로퍼티 래퍼를 사용하는 것이다. 이 래퍼는 래퍼 프로퍼티 값이 변경될 때마다 모든 구독자에게 업데이트를 알리게 된다.

다음의 구조체 선언은 두 개의 게시된 프로퍼티를 가진 간단한 Observable 객체 선언을 보여준다.

import Foundation import Combine class DemoData: ObservableObject { @Published var userCount = 0 @Published var currentUser = "" init() { // 데이터 초기화 코드 updateData() } func updateData() { // 데이터를 최신 상태로 유지하기 위한 코드 } } 
import SwiftUI struct ContentView: View { @ObservedObject var demoData : DemoData = DemoData() // demoData는 DemoData 구조체 타입이고, DemoData야. var body: some View { Text("\(demoData.currentUser), you are user number \(demoData.userCount)") } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(demoData: DemoData()) } } 

State 객체

상태 객체(State object) 프로퍼티 래퍼 @StateObject는 @ObservedObject 래퍼의 대안이다. 상태 객체와 관찰되는 객체의 주요 차이점은, 관찰되는 객체 참조는 그것을 선언한 뷰가 소유하지 않으므로 사용되는 동안에(예를 들어, 뷰가 다시 렌더링된 결과) SwiftUI 시스템에 의해 파괴되거나 다시 생성될 위험이 있다는 것이다.

import SwiftUI struct ContentView: View { @StateObject var demoData: DemoData = DemoData() var body: some View { Text("\(demoData.currentUSer), you are user number \(demoData.userCount)" } } 

State VS ObservedObject

1. @State는 뷰 한정, @ObservedObject는 외부 공유

@State

@ObservableObject + @ObservedObject/@StateObject

2. ObservableObject + @Published 동작 흐름

  1. ObservableObject 프로토콜 채택: "나는 바뀌면 알려줄 수 있는 객체다" 선언
  2. @Published 붙인 프로퍼티: 값이 바뀌면 자동으로 이벤트 발행
  3. 뷰에서 @ObservedObject나 @StateObject로 구독: 값이 바뀌는 이벤트를 받으면 자동으로 뷰 다시 그림

3. 구체적인 차이

@ObservedObject

@StateObject

4. 비유