본문 바로가기

Combine

[Combine] Publisher 와 Subscriber 는 어떻게 연결할 수 있을까?

 

 

 

지난번 글을 통해 간단하게 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 에 대해 알아보도록 하겠습니다.

읽어주셔서 감사합니다. 🙇🏻