728x90
Observable 객체
- 상태 프로퍼티는 하위 뷰가 아니거나 상태 바인딩이 구현되어 있지 않은 다른 뷰는 접근할 수 없다.
- 상태 프로퍼티는 일시적인 것이어서 부모 뷰가 사라지면 그 상태도 사라진다.
- 하지만 Observable 객체는 여러 다른 뷰들이 외부에서 접근할 수 있는 영구적인 데이터를 표현하기 위해 사용된다.
- Observable 객체는 ObservableObject 프로토콜을 따르는 클래스, 구조체 형태를 취한다.
- 일반적으로 시간에 따라 변경되는 하나 이상의 데이터 값을 모으고 관리하는 역할을 담당한다.
- 타이머, 알림(notification)과 같은 이벤트를 처리하기 위해 사용되기도 한다.
게시자(publisher) - 구독자(subscriber)
- Observable 객체는 게시된 프로퍼티(published property)로서 데이터 값을 게시(publish) 한다.
- Observer 객체는 게시자를 구독(subscribe)하여 게시된 프로퍼티가 변경될 때마다 업데이트 받는다.
- SwiftUI 뷰는 Observable 객체에 저장된 데이터가 변경됨을 반영하기 위해 자동으로 업데이트 된다.
Combine 프레임워크
- Combine 프레임워크에 포함된 Observable 객체는 게시자(publisher) - 구독자(subscriber) 간의 관계를 쉽게 구축하도록 iOS13에 도입되었다.
- Combine 프레임워크는 여러 게시자를 하나의 스트림으로 병합, 게시된 데이터를 구독자 요구에 맞게 변형하는 것까지 다양한 작업을 수행하는 커스텀 게시자 구축 플랫폼을 제공한다.
Example
- listData라는 '게시된 프로퍼티'를 가지는 Observable 객체를 구현한다.
- listData에 데이터가 추가될 때마다 ContentView를 새로 그리게 된다.
import SwiftUI
struct ContentView: View {
@ObservedObject var data: DemoData = DemoData()
var body: some View {
VStack {
// 현재 리스트에 있는 숫자들을 보여준다.
Text(data.listData.description)
// 버튼을 클릭할 때마다 리스트에 5라는 숫자가 append 된다.
Button(action: {
data.listData.append(5)
}, label: {
Text("Click")
})
}
}
}
class DemoData: ObservableObject {
@Published var listData: [Int] = [0, 1, 2]
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewDevice("iPhone 11")
.previewDisplayName("아이폰 11")
}
}
728x90
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] Environment 객체 (0) | 2022.01.16 |
---|---|
[SwiftUI] List, Observable 객체 활용 예시 (0) | 2022.01.16 |
[SwiftUI] 상태 바인딩 (State Binding) (0) | 2022.01.15 |
[SwiftUI] 상태 프로퍼티 (State Property) (0) | 2022.01.15 |
[SwiftUI] 게시자(publisher), 구독자(subscriber) 구축 (0) | 2022.01.15 |
댓글