https://developer.apple.com/documentation/combine/publisher
Declares that a type can transmit a sequence of values over time.
protocol Publisher<Output, Failure>
퍼블리셔는 하나 이상의 Subscriber 인스턴스에 요소들을 전달합니다. Subscriber의 인풋과 Failure associated type은 퍼블리셔에 의해 정의된 아웃풋 및 Failure 타입과 일치해야 합니다. 퍼블리셔는 Subscriber를 수락하기 위해 receive(subscriber:)
메소드를 구현합니다.
이후 퍼블리셔는 Subscriber에 아래 메소드를 호출할 수 있습니다.
receive(subscription:)
: Subscribe 요청을 확인하고 Subscription 인스턴스를 반환합니다. Subscriber는 퍼블리셔로부터 요소들을 요구하기 위해 Subscription을 사용하며, 퍼블리싱을 취소하기 위해 사용할 수 있습니다.receive(_:)
: 퍼블리셔로부터 Subscriber에게 하나의 요소를 전달합니다.receive(completion:)
: 정상적인지 혹은 오류와 함께 퍼블리싱이 완료되었다고 Subscriber에게 알려줍니다.모든 퍼블리셔는 기능이 정확하게 작동할 수 있도록 다운스트림 Subscriber에 대해서 이와 같은 계약을 준수해야 합니다.
퍼블리셔에 대한 확장은 복잡한 이벤트 처리 연쇄를 생성하기 위해 구성하는 다양한 연산자를 정의합니다. 각 연산자는 퍼블리셔 프로토콜이 구현하고 있는 타입을 반환합니다. 대부분의 타입은 퍼블리셔 열거형에 확장으로써 존재합니다. 예를 들어 map(_:)
은 Publishers.Map
의 인스턴스를 반환합니다.
Tip
컴바인 퍼블리셔는 스위프트 표준 라이브러리에 있는AsyncSequence
와 유사하면서도 다른 역할을 충족합니다. 퍼블리셔와AsyncSequence
모두 시간에 걸쳐 요소들을 제공합니다. 그러나 컴바인에서 가져오는 모델은 퍼블리셔로부터 요소들을 요청하기 위해 Subscriber를 사용하는 반면 스위프트 동시성은AsyncSequence
에 의해 제공된 요소들을 반복하기 위해서for-await-in
구문을 사용합니다. 두 API 모두 mapping 혹은 필터링에 의한 시퀀스를 수정 메소드를 제공하지만, 컴바인만이 시간에 기반한 동작 기능을 제공하며debounce(for:scheduler:options:)
,throttle(for:scheduler:latest:)
와 같은 것이 있습니다. 또한, 컴바인은 조합 동작인merge(with:)
,combineLatest(_:_:)
도 갖고 있습니다. 두 가지 접근방법을 연결하려면 속성 값이 퍼블리셔의 요소들을AsyncSequence
로 내보내야 하며, Subscriber에 붙는 것이 아닌for-await-in
으로 시간에 따라 반복할 수 있도록 해줍니다.
퍼블리셔 프로토콜을 직접 구현하기보다 컴바인 프레임워크에서 제공하는 여러 타입 중 한 가지를 사용해서 고유한 퍼블리셔를 생성할 수 있습니다.
PassthroughSubject
처럼 send(_:)
메소드를 호출해서 요구에 따라 값을 퍼블리시 하기 위해 Subject의 구체화 하위 클래스를 사용할 수 있습니다.CurrentValueSubject
를 사용합니다.@Published
표기법을 추가할 수 있습니다. 이렇게 하면 해당 속성은 속성의 값이 변경될 때마다 이벤트를 내보내는 퍼블리셔를 얻습니다. 예시는 아래 링크를 보시기 바랍니다.Published
https://developer.apple.com/documentation/combine/published