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을 이용해 원소를 요청할 수 있다. 이 때, 원소가 어디에서 만들어지는지는 제약이 없다. Publisher와 관계를 가지고 Produced된 아이템이 있는 Queue에서 뺴올 수도 있고, Subscription이 자체적으로 아이템을 만들 수도 있다. 어찌보면, Subscription은 수신횟수가 제한된 삐삐와 비슷하다.

Subscription은 Cancellable 프로토콜을 따르고 있기 때문에, 구독을 취소해야할 경우에는 cancel()를 통해 구독을 취소할 수 있다.

서브스크라이버는 서브스크립션을 cancel()할 수 있다.

To-do:

RXSwift의 예 추가하기

카테고리: 미분류