Combine 살펴보기: Subscriber
Subscriber
A protocol that declares a type that can receive input from a publisher.
퍼블리셔로부터 입력을 받을 수 있는 타입을 정의하는 프로토콜.
Apple Documentation
Subscriber는 Publisher를 구독하는 타입이다. RX에서는 동일한 역할을 하는 객체를 Observer라고 부르며, 경우에 따라 Watcher, 또는 Reactor라고도 부르는 것 같다.
Publisher로 부터 입력을 받기 때문에 Input과 Failure를 정의해야한다. Publisher를 통해 subscribe(_:) 할 때, 내부적으로 Subscriber의 receive(subscription:) 함수가 호출되면서 Subscription을 전달받고, 구독이 시작된다.
퍼블리셔의 경우에는 용도에 따라서 이미 구현된 Convenience Publisher가 굉장히 많지만, Subscriber의 경우에는 Convenience Subscriber로 클로저를 실행하는 Sink와 값을 매핑하는 Assign 두 종류만 있으며, Operator로의 활용에서도 동일하다.
Assign으로 값을 매핑할 때는 조심해야할 부분이 있는데, 만약 매핑하는 대상 객체가 순환 참조를 이루고 있다면 Assign은 그 값들을 강한 참조(strong reference)로 기록하기 때문에 메모리가 누수될 수 있다.
Subscription
서브스크라이버가 퍼블리셔를 구독할 때, subscriber의 receive(subscription:)이 호출된다. 이를 통해 subscriber는 subscription을 전달받을 수 있고, publisher에게 원소를 요청하거나 구독을 취소할 수 있다.
Subscription을 통해 원소를 요청할 때는 request()를 사용한다. 이때, Demand 구조체를 매개변수로 넘긴다. Demand를 통해 Publisher에게 해당 시점에 최대 얼마만큼의 요구를 할 지 지정할 수 있다.
Subscription은 Cancellable 프로토콜을 따르고 있기 때문에, 구독을 취소해야할 경우에는 cancel()를 통해 구독을 취소할 수 있다.
To-do:
RXSwift의 예 추가하기