Publisher
프로토콜을 직접 구현하는 대신 Combine 프레임워크가 제공하는 타입들을 이용하면 간편하게 Custom Publisher를 구현할 수 있다.Subject 는 값을 외부에서 publish할 수 있는 메서드를 제공하는 Publisher protocol이다.
값을 주입할 때에는 send(_:)
메서드를 이용한다.
PassthroughSubject(final class)
CurrentValueSubject(final class)
value
프로퍼티를 가지고 있으면서 send(_:)
메서드가 호출될 때마다 value
를 해당 값으로 갱신한다. → value
를 통해 가장 최근에 pubilsh된 값에 접근할 수 있다.value
를 보내준다.타입 프로퍼티에 @Published
를 추가하여 해당 프로퍼티의 값이 변경될 때마다 값을 보내주는 publisher를 생성할 수 있다. $
를 프로퍼티 이름 앞에 추가하여 publisher에 접근한다.
willSet
블록에서 publishing이 일어난다. 즉, 실제 값이 프로퍼티에 적용되기 전에 subscriber는 값을 받게 된다.고유한 프로퍼티를 가지지 않는, publisher의 구현체이다. upstream publisher로부터 받은 값들과 completion(성공/실패 여부)들을 전달해주는 역할은 유지하고 있으므로 타입 특이적인 정보를 지우는 데(type erasure) 이용된다.
send(_:)
) 가능한 Subject 등에서 타입에 의존되는 메서드나 프로퍼티를 감추고 싶을 때이용하면 좋다.
eraseToAnyPublisher()
operator를 통해 publisher를 AnyPublisher로 간단하게 wrap할 수 있다.Publisher로부터 Subscriber가 값을 받기 위해서는 1. Subscription이 필요하고, 2. Demand(값을 요청하는 것)가 필요하다.
Demand
request(_:)
메서드를 호출하여 값을 요청한다.receive(_:)
메서드를 호출한다. 메서드의 리턴 값으로 Demand를 리턴한다.high or unlimited demand
sink(receiveValue:)
, assign(to:on:)
을 통해 생성되는 편의 Subscriber는 처음 publisher와 연결되자마자 unlimited
Demand를 보낸다.custom subscriber
"--done--"
도 아직 출력되지 않았다.publisher.send(completion: .finished)
를 호출하여 완료하거나, 그 전에 subscription 객체를 이용해서 새로운 demand를 보낼 수도 있다.A protocol indicating that an activity or action supports cancellation.
cancel()
을 호출하여 할당된 리소스들을 제거하고 subscription을 중단한다.cancel()
을 호출한다. AnyCancellable로 subscription을 property에 저장해두면 해당 인스턴스가 메모리에서 제거될 때 subscription과 할당된 메모리를 자동으로 해제한다.store(in:)
을 통해 collection이나 set에 cancellable instance를 저장할 수도 있다.