이번 포스트에서는 Combine에서 포스트 하나로 다루기는 내용이 많지 않지만 중요한 개념들을 다뤄보고자 합니다.
-
Cancellable
Cancellable 프로토콜은 특정 연산이 취소가 가능함을 의미합니다. Subscriber를 직접 구현한다면 이 Cancellable을 채택해서 작업을 취소할 수 있도록 해줘야 합니다. 이 구현은 Subscriber가 가지고 있는(취소를 위해서는 반드시 실제 연산이 진행되는 Subscription 객체를 Subscriber가 가지고 있어야 합니다) Subscription 객체를 대상으로 cancel() 호출하고, Subscriber가 가지고 있는 참조를 없애는 것으로 간단하게 구현할 수 있습니다. 이는 Subscription 프로토콜이 Cancellable 객체를 상속 받기 때문입니다. 참고로 Apple이 제공하는 Subscriber인 Sink와 Assign은 이미 Cancellable이 구현되어 있습니다. 만약 Subscription 마저 직접 구현해야 한다면, 연산 취소 기능은 Subscription에 직접 구현해야합니다. -
Subject
subject는 Publisher의 일종인데, 외부에서 값을 주입할 수 있는 Publisher입니다. Operator와 뭐가 다른가 싶지만, Operator 객체는 직접 만들 일이 없고 값을 가공하거나 필터링하는 등의 기능적인 이유로 사용하는 데 반해, Subject는 다른 곳에서 만들어진 값을 Combine의 인터페이스로 사용할 수 있도록 만드는데 그 목적이 있습니다. Subject는 send(_:)라는 메소드를 추가적으로 제공해주며, 이 메소드를 통해 값이나 완료, 에러 메시지를 보낼 수 있습니다. 그렇게 되면 이 subject를 구독하고 있는 모든 Subscriber에게 이 값이 전달되게 됩니다. Subject역시 Publisher의 일종이기 때문에 여러 Operator를 붙일 수 있습니다. Apple이 기본 제공해주는 subject로는 PassthroughSubject와 CurrentValueSubject가 있으며, 이 두가지의 차이는 갸장 마지막에 내보낸 값을 내부에서 저장하고 있는지 여부입니다. Passthrough는 말그대로 그냥 통과해버리기 때문에 저장을 안하고 있고, CurrentValue는 가장 마지막에 내보낸 값을 저장하고 있습니다. 만약 새로운 Subscriber가 CurrentValueSubject를 구독한다면, 구독하는 순간에 Subject가 가지고 있던 값을 즉시 받을 수 있습니다. -
ConnectablePublisher
Publisher에는 두가지 종류가 있습니다. 구독이 일어나야만 실제로 동작하는 일반 Publisher와, connect()을 명시적으로 호출해줘야 동작하는 ConnectablePublisher의 두가지입니다. ConnectablePublisher는 구독 여부와 상관없이 자신의 동작을 수행할 수 있습니다. ConnectablePublisher는 구독자 여부에 상관이 없이 동작한다는 점 때문에 시간과 관련된 작업에서 종종 사용됩니다.
이로써 Combine에 대한 중요한 개념들을 살펴보았습니다. 이제 해야할 일은 적절한 연산자를 조합하여 원하는 로직을 만들어내고 활용하는 방법을 숙달하는 과정을 거치는 것입니다.