sink(..)
와 assign(..)
은 자동으로 Input과 Failure를 연결된 publisher와 동일하게 맞춰준다.publisher는 subscriber가 1. 연결되고 2. 값을 요청했을 때에만 값을 전달할 수 있다.
이를 위해 publisher와 subscriber는 각각 하나, 세 개의 required method를 가진다.
receive<S>(subscriber: S)
: subscriber를 publisher에 연결해준다.receive(Self.Input) -> Subscribers.Demand
: subscriber에게 publisher가 element(값)를 생성했음을 알려준다.receive(subscription: Subscription)
: subscriber에게 publisher와의 연결이 성공했고, 값을 요청가능함을 알려준다.receive(completion: Subscribers.Completion<Self.Failure>
: subscriber에게 publisher가 값 전달을 완료했음을 알려준다(성공/실패의 여부와 함께)그럼 해당 메서드를 이용해서 publisher와 subscriber가 연결되는 과정에 대해 알아보자
1. 연결(subscribe)
publisher.subscribe(subscriber)
publisher가 subscriber에게 값을 전달해주기 위해서는 일단 subscriber가 publisher를 구독(subscribe)하여 연결되어야 한다. 이는 publisher의 subscribe(_:)
메서드를 통해 이루어진다. 해당 메서드는 publisher의 required method인 receive(subscriber: S)
를 호출한다.receive(subscription: Subscription)
을 호출한다. subscription을 이용하여 subscriber는2. 값을 요청하기
Subscriber.request(Subscribers.Demand)
를 이용해서 요청할 수 있다. .unlimited
, .max(Int)
, .none
등이 있다.sink(receiveValue:)
의 경우 연결된 후 즉시 unlimited 를 요청한다.3.값을 전달하기
subscriber.receive(_)
publisher는 값을 요청받은 후 위 메서드를 호출하여 값을 전달해준다.subscriber.receive(completion:)
값을 모두 전달한 후에는 위 메서드를 통해 정상적으로 요청을 마쳤는지, 실패했는지를 알려준다. completion을 전달한 후에는 값을 다시 생성할 수 없다.Cancellables
receive(subscription:)
을 호출함으로써 Cancellable을 상속하는 Subscription을 전달해준다.cancel()
메서드를 호출하면 subscription이 중단되고, publisher는 값을 더이상 생성하지 않게 된다.AnyCancellable
을 이용하면 subscription의 수명을 손쉽게 제어할 수 있다. AnyCancellable은 deinit 될 때 자동으로 cancel()을 호출하기 때문. AnyCancellable로 모든 subscription을 property로 저장해두면 해당 인스턴스가 메모리에서 제거될 때 subscription도 자동으로 제거된다.Combine이 이미 제공하는 Publisher 클래스를 이용할 수 있다.
어떤 값
) 을 통해 Publisher를 만들어서 operator로 연결해줄 수 있다..request(Subscribers.Demand)
를 통해 값을 요청받은 후 promise 클로져를 실행한다) 클로져가 모두 실행된 후에야 subscription이 완료된다.completeImmediately:Bool
을 초기화할 때 받는다. completion을 즉시 전달할 지 여부이다.subscribe(_:)
를 호출한 후)에 전달된 값과 completion만 받을 수 있다. Record는 input과 completion을 저장해놨다가 subscriber가 연결되면 연결 전의 input과 completion을 그대로 전달(playback)해준다.