https://developer.apple.com/documentation/combine/publisher
"Declares that a type can transmit a sequence of values over time."
시간에 걸쳐 값들의 연속이 전송될 수 있는 타입임을 선언합니다.
protocol Publisher
하나의 퍼블리셔는 하나 이상의 구독자 인스턴스에게 어떤 요소들을 전달합니다. 구독자의 입력, Failure에 연관된 타입들은 구독자에 의해 선언된 출력, Failure 타입들과 일치해야 합니다. 퍼블리셔는 receive(subscriber:)
메소드를 수행해 구독자를 수락합니다.
이후 퍼블리셔는 구독자에 대해 아래와 같은 메소드를 호출할 수 있습니다.
receive(subscription:)
: 구독 요청을 받아들이고 구독 인스턴스를 반환합니다. 구독자는 퍼블리셔로부터 요소들을 요구하기 위해 구독을 사용하고, 구독을 사용함으로써 퍼블리싱을 취소할 수 있습니다.receive(_:)
: 퍼블리셔로부터 구독자에게 하나의 요소를 전달합니다.receive(completion:)
: 퍼블리싱이 끝났다고 구독자에게 알려주며, 정상적인지 에러인지는 신경쓰지 않습니다.모든 퍼블리셔는 다운스트림 구독자들이 정확하게 동작할 수 있도록 이와 같은 계약을 고수해야 합니다.
퍼블리셔의 확장은 복잡한 이벤트 처리의 연쇄를 생성하기 위해 다양한 오퍼레이터들을 구성하도록 할 수 있습니다. 각각의 오퍼레이터는 퍼블리셔 프로토콜을 수행하는 하나의 타입을 반환합니다. 대부분의 이런 타입들은 퍼블리셔 열거형에 확장된 형태로써 존재합니다. 예를 들어 map(_:)
오퍼레이터는 Publishers.Map
의 인스턴스를 반환합니다.
퍼블리셔 프로토콜 자체를 생성하는 것이 아니라 커스텀 퍼블리셔를 생성할 수 있습니다. 이는 Combine 프레임워크에서 제공하는 여러 가지 타입들을 사용함으로써 구현할 수 있습니다.
Subject
의 구체적인 서브클래스를 사용하는 방법이 있습니다. 예를 들면 PassthroughSubject
와 같은 것이 있는데, 갖고 있는 send(_:)
메소드를 호출함으로써 on-demand value를 보낼 수 있습니다.CurrentValueSubject
를 사용함으로써 subject
가 갖고 있는 기본값의 업데이트가 필요할 때마다 퍼블리싱을 할 수 있습니다.@Published
표기법을 추가할 수 있습니다. 이렇게 함으로써 프로퍼티는 프로퍼티의 값 변화가 필요할 때마다 이를 전달하는 퍼블리셔와 연결될 수 있습니다. 이와 관련한 예제는 아래 링크에서 확인할 수 있습니다.