지난번 글을 통해 간단하게 Combine 이 무엇이고
Publisher, Operator, Subscriber 에 대해 알아봤습니다.
이번엔 좀 더 나아가 어떻게 사용하는지 확인해보겠습니다.
Publisher 와 Subscriber 를 연결해주는 보편적인 방법으로는
1. .subscribe
2.sink
3. assign(to:on:)
으로 볼 수 있습니다. sink 는 이전 글에서도 한번 다룬적이 있지만
다시 한번 설명을 위해 작성해보도록 하겠습니다.
1. .subscribe
let coupangPublisher = ["요거트","사과","아이폰","에어팟"].publisher
class CoupangSubscriber: Subscriber {
typealias Input = String
typealias Failure = Never
func receive(subscription: Subscription) {
print("쿠팡Publisher를 Subscriber에게 전달할 준비됨")
subscription.request(.unlimited)
}
func receive(_ input: String) -> Subscribers.Demand {
print("현재 주문 제품은: \(input)")
return .none
}
func receive(completion: Subscribers.Completion<Never>) {
print("주문목록 처리 완료!")
}
}
coupangPublisher.subscribe(CoupangSubscriber())
Subscriber 는 위 처럼 3가지의 메서드를 만들어서
원하는 결과값을 받을 수 있도록 설정할 수 있습니다.
각각의 메서드들이 어느 시점에서 호출되어
Publisher 와 연결되는지에 대해선 따로 글을
작성해보도록 하겠습니다.
결과적으로, Subscriber 프로토콜을 따르는
CoupangSubscriber 클래스를 만들고
위와 같이 사용해줍니다.
coupangPublisher(쿠팡을)
subscribe(구독하는데)
coupangSubscriber(주문목록 처리에 대해 알려줘)
코드를 실행하면 아래와 같은 결과를 확인할 수 있습니다.
2. sink
let coupangPublisher = ["요거트","사과","아이폰","에어팟"].publisher
coupangPublisher.sink(receiveCompletion: { _ in
print("주문목록 처리 완료!")
}, receiveValue: { product in
print(product)
})
sink 방식을 사용하면 이전에 알아봤던 .subscribe 방식 처럼
Subscriber 프로토콜을 따르는 클래스를 따로 지정하고 메서드를 정의해주는
번거로움을 피할 수 있습니다.
단순히 어떤 데이터를 데이터를 받고 결과는 어떤지에 대해 알려줍니다.
3. assign(to:on:)
class SomeObject {
var value: String = "" {
didSet {
print("SomeObject: \(value)")
}
}
}
let object = SomeObject()
_ = coupangPublisher.assign(to: \.value , on: object)
assign(to:on:) 메서드는 Publisher 의 값을
특정 프로퍼티에 전달하고자 할때 사용하게 됩니다.
결과는 아래와 같습니다.
다음 글에선 Publisher 프로토콜을 채택하고,
데이터 스트림을 생성 & 관리하는데 중요한 역할을 하는
Subject 에 대해 알아보도록 하겠습니다.
읽어주셔서 감사합니다. 🙇🏻
'Combine' 카테고리의 다른 글
[Combine] ViewModel 의 상태변화를 View 에게 알려주고 싶다면 어떻게 해야할까? (0) | 2023.10.25 |
---|---|
[Combine] SwiftUI 에서는 Publisher 를 어떻게 구독할까? (0) | 2023.10.08 |
[Combine] Subject 알아보기 (PassthroughSubject / CurrentValueSubject) (0) | 2023.10.05 |
[Combine] Publisher / Operator / Subscriber 알아보기 (0) | 2023.09.27 |
[Combine] eraseToAnyPublisher 는 무엇이고 어떻게 사용하는걸까? (0) | 2023.09.23 |