728x90
저번 글에서 가볍게 Combine을 맛봤다. 이제는 실전으로 이것저것 써보자
Combine에서 쉽게 Publisher를 만드는 방법 중 하나는 CurrentValueSubject와 PassthroughSubject 이다.
CurrentValueSubjcet
Single Value를 감싸고 있는 Subject로써 Value 값이 변화면 Publish 한다!
import Combine
import SwiftUI
struct CombineView: View {
var vm = CombineViewModel()
@State var anyCancellable = Set<AnyCancellable>()
@State var number = 0
var body: some View {
VStack {
Text("\(number)")
.padding()
Button(action: { vm.number.send(vm.number.value + 1)
print(vm.number.value)
}, label: {
Text("Button")
})
.padding()
.onAppear {
vm.number.sink { [self] value in
DispatchQueue.main.async {
self.number = value
}
}.store(in: &anyCancellable)
}
}
}
}
class CombineViewModel {
var number = CurrentValueSubject<Int, Never>(5)
}
CombineViewModel
에서 Publisher 인 CurrentValueSubject(Publisher)
가 있다.
그리고 body의 onAppear 함수에서 number를 subscriber(sink 함수)
가 있다.
그렇기에 Value가 변했고 이를 subscribe하는 객체들의 sink 함수의 closure가 작동한다.
PassthroughSubject
Subjcet로서 elements를 아래 subscribers로 전달한다.
import Combine
import SwiftUI
struct CombineView: View {
var vm = CombineViewModel()
@State var anyCancellable = Set<AnyCancellable>()
@State var number = 0
var body: some View {
VStack {
Text("\(number)")
.padding()
Button(action: { vm.number.send(300) // # 수정됨
}, label: {
Text("Button")
})
.padding()
.onAppear {
vm.number.sink { [self] value in
DispatchQueue.main.async {
self.number = value
}
}.store(in: &anyCancellable)
}
}
}
}
class CombineViewModel {
var number = PassthroughSubject<Int, Never>()
}
위 코드를 함수를 작동하면 CurrentValueSubject와 동일하게 작동한다.
음? 그럼 PassthroughSubject와 CurrentValueSubject의 차이점은 무엇일까??
PassthroughSubject & CurrentValueSubject 차이점
PassthroughSubject와 CurrentValueSubject의 코드 차이를 보면
PassthroughSubject에서 버튼의 vm.number.value
을 출력하는 함수가 없다 왜일까?
PassthroughSubject와 CurrentValueSubject의 차이점 때문이다.
PassthroughSubject는 elements를 Subscriber에게 전달한다고 했지 값을 보유하지 않는다.
반면 CurrentValueSubject는 값을 보유한다.
728x90
'Swift > Apple Framework' 카테고리의 다른 글
[iOS / SwiftUI] Combine - URLSession (0) | 2023.05.08 |
---|---|
[iOS / SwiftUI] Combine - AnyCancellable (0) | 2023.05.08 |
[SwiftUI] StateObject와 ObservedObject 차이점 (0) | 2023.04.22 |
[iOS / Swift] sort() 는 어떤 알고리즘을 쓸까? (0) | 2023.04.22 |
[iOS / SwiftUI] Combine - 맛보기 (2) | 2023.04.21 |