@State와 클래스를 함께 사용하면, @State와 구조체를 함께 사용했을 때와는 다르게 데이터가 업데이트 되지 않는다.
class Book: ObservableObject { // 1. 클래스가 ObservableObject를 준수하도록 설정
var year = ""
var price = ""
}
struct BindingWithClassData: View {
@StateObject var book = Book() // 2. @StateObjcet 변수에 할당
}
/// ❗️이 상태에서는 데이터는 여전히 업데이트되지 않음!
class Book: ObservableObject {
// 3. @Published로 변경할 속성 게시!
@Published var year = ""
@Published var price = ""
}
struct BindingWithClassData: View {
@StateObject var book = Book()
}
클래스 데이터의 변경사항이 UI에 자동으로 업데이트되도록(양방향 바인딩) 하기 위한 3단계
1. 클래스가 ObservableObject 준수하도록 한다. (UI가 이제부터 객체의 변경사항을 관찰할 수 있다는 의미)
2. @Published를 속성에 추가해, UI에 변경사항 알림. (@Published가 없으면 이 속성의 값이 변경될 때 UI에 알릴 수 없음)
3. @StateObject를 사용해 ObservableObject를 UI에 바인딩. (이 @StateObject는 UI와 ObservableObject간의 양방향 통신을 허용)
👉 이런 요구 사항을 반드시 순서대로 수행할 필요는 없지만, 데이터와 UI간의 양방향 바인딩을 위해 모든 요소는 존재해야 한다.
보통 외부 소스에서 데이터를 얻는 경우가 많고, 얼마나 오래 걸릴지 모른다. 해당 외부 소스가 한 번에 데이터를 얼마나 보낼지조차 모를 수 있다.
하지만 @Published는 데이터가 수신되면 시간이 지남에 따라 알림을 계속 보낸다.