티스토리 뷰
[SwiftUI] - Combine 예제
Combine의 개념은 이전에 간략하게 설명하여서 참고하면 좋겠다. [SwiftUI] - Combine이란? SwiftUI를 좀 더 깊게 이해하고 사용하기 위해서는 Combine에 대한 이해는 필수적이라고 한다. Combine 많이 들어는
steelbeartaeng2.tistory.com
✏️ ObservableObject란?
ObservableObject를 구현하기 위해서는 3가지 요소를 사용해줘야 한다.
1️⃣ protocol ObservableObject
: 상태를 관리하고 추적하는 데 사용
이 프로토콜을 채택하는 객체는 해당 객체의 속성이 변경될 때 마다 SwiftUI에게 해당 변경사항을 알린다.
import SwiftUI
class MyViewModel: ObservableObject {
@Published var name: String = "hee"
}
2️⃣ @Published
: ObservableObject 프로토콜을 채택한 클래스 내에서 사용
해당 속성이 변경될 때마다 Publisher가 해당 변경을 자동으로 발행한다.
이를 통해 ObservableObject를 구독하는 View는 해당 속성의 변경을 감지하고 UI를 업데이트한다.
3️⃣ @ObservedObject
: Swift View 내에서 ObservableObject를 구독하고 값이 업데이트될 때 마다 View를 갱신하는 property wrapper이다.
import SwiftUI
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
var body: some View {
Text("Hello, \(viewModel.name)")
}
}
💻 ObservableObject 예제 코드
예제는 위의 Combine 예제와 같은 걸로 똑같은 기능을 ObservableObject를 사용해서 구현하였다.
- ContentView
import SwiftUI
struct ContentView: View {
@ObservedObject var viewModel = CounterViewModel()
var body: some View {
VStack(spacing: 20){
Text("\(viewModel.count)")
Button(action: {
self.viewModel.incrementCount()
}) {
Text("Button")
.font(.title)
}
Button(action: {
self.viewModel.resetCount()
}) {
Text("Reset")
.foregroundColor(.red)
}
}
.padding()
}
}
#Preview {
ContentView()
}
- CounterViewModel
import SwiftUI
class CounterViewModel: ObservableObject {
@Published var count = 0
func incrementCount() {
count += 1
}
func resetCount(){
count = 0
}
}
ObservableObject vs Combine
블로그 몇개를 참고하다보니 둘 다 같은 의미인건가...? Combine에 ObservableObject가 속하는 건가 했는데 아니었다.
둘은 다른 개념이다~~
ObservableObject를 사용하여 상태를 관찰하고 Combine을 사용하여 비동기 작업 처리와 데이터 흐름을 관리하는 등의 작업을 수행할 수 있다.
즉, 두 기술은 함께 사용될 수 있으며 상태 관리는 ObservableObject, 상태 변경에 따른 비동기 작업 수행/데이터 흐름 관리는 Combine이 수행한다.
ObservableObject vs CurrentValueSubject
그렇다면 같은 예제인데 ObservableObject와 Combine의 구현이 다른 것은 무엇 때문일까?
ObservableObject와 CurrentValueSubject 차이 때문이다.
나는 자꾸 ObservableObject와 Combine을 비교했는데 비교 대상 자체가 잘못된 것이었다.
✏️ CurrentValueSubject
: Combine 프레임워크의 클래스로, 값을 발행하는 Subject 중 하나이다.
현재 값을 유지하고, 새로운 값을 발행할 수 있으며, 초기값을 가질 수 있다.
그럼 Combine을 사용할 때 ObservableObject와 CurrentValueSubject 중 어떤 걸 쓰는게 좋을까?
이건 상황에 따라 다르다.
1️⃣ 상태 관리 및 UI 업데이트 => ObservableObject
2️⃣ 데이터 스트림 관리 및 조작 => CurrentValueSubject
따라서 상태 관리와 UI 업데이트에 중점을 두는 경우 ObservableObject를 사용하고,
데이터 스트림 관리 및 조작에 중점을 두는 경우 CurrentValueSubject를 사용하는 것이 좋다.
물론 두 가지를 함께 사용하여 상태 관리와 데이터 흐름 처리 통합적으로 다루는 것도 가능하다.
'스위프트 > SwiftUI' 카테고리의 다른 글
[SwiftUI] - NavigationLink Action 추가 (0) | 2024.04.07 |
---|---|
[SwiftUI] - Custom Font 적용 (0) | 2024.03.19 |
[SwiftUI] - Combine 예제 (0) | 2024.03.11 |
[SwiftUI] - Combine이란? (0) | 2024.03.11 |
[SwiftUI] - NavigationBarTitle 스타일 (0) | 2024.02.29 |