이재용의 iOS

Publisher

2024년 5월 10일 • ☕️ 1 min read

Publisher

DataStream이나 event를 생성(발행)하고 구독자에게 전달하는 역할을 하는 객체.

특징

  • DataStream(데이터 스트림)은 **시간에 따라 연속적으로 발생하는 데이터 시퀀스**로, Publisher에서 Subscriber까지 이어지는 데이터의 흐름을 말함
  • UpStream(업스트림)은 데이터 소스 발생지이고 DownStream(다운스트림)은 데이터가 처리되고 소비되는 지점이다. A PublisherB PublisherC Publisher 가 있다면 A는 B에게, B는 C에게 UpStream이고 B는 A에게 C는 B에게 DownStream이다. 즉 Publisher는 UpStream이 될 수도, DownStream이 될 수도 있다.
  • DataStream은 .finished / .failure / 명시적인 구독 취소 3가지 방법으로 종료될 수 있다.

DeepDive

개발할 때는 Publisher을 채택한 다양한 내장 Publisher들을 사용하거나 sink같은 고수준 API를 주로 사용한다. 그렇기에 Publisher가 어떻게 구성되어 있는지 안다면 더 활용하기 편리할 수 있다.

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
public protocol Publisher<Output, Failure> {
    associatedtype Output
    associatedtype Failure : Error
    
    func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}

Publisher는 Output / Failure 2가지 제네릭 타입을 반드시 가져야 한다. Output은 Publisher가 발행할 타입이고, Failure는 Publisher가 발행할 수도 있는 에러입니다. Failure는 Error타입을 준수하는 어떤 타입이든 상관없이 Failure가 될 수 있기 때문에 사용자 정의 에러를 넣을 수 있다. 이렇게 타입을 확실하게 명시하기 떄문에 타입 안정성이 보장된다.

receive 메서드는 Publisher가 Subscriber을 받을 때 호출되면 Publisher가 Subscriber에게 Subscription 인스턴스를 전달하면서 구독을 시작한다. 여기서 Subscription인스턴스는 Publisher와 Subscriber 사이의 구독 생명주기를 관리하는 객체입니다.

종류

  • Just
  • Empty
  • Fail
  • Future
  • Record
  • Deferred
  • AnyPublisher