세상을 더 편리하게
article thumbnail
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
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!