Publisher

Horus-iOS·2022년 12월 27일
0

Combine

목록 보기
2/9

https://developer.apple.com/documentation/combine/publisher

Declares that a type can transmit a sequence of values over time.

Declaration

protocol Publisher<Output, Failure>

Overview

퍼블리셔는 하나 이상의 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으로 시간에 따라 반복할 수 있도록 해줍니다.

Creating Your Own Publishers

퍼블리셔 프로토콜을 직접 구현하기보다 컴바인 프레임워크에서 제공하는 여러 타입 중 한 가지를 사용해서 고유한 퍼블리셔를 생성할 수 있습니다.

  • PassthroughSubject처럼 send(_:) 메소드를 호출해서 요구에 따라 값을 퍼블리시 하기 위해 Subject의 구체화 하위 클래스를 사용할 수 있습니다.
  • Subject의 기초 값을 업데이트할 때마다 퍼블리시를 할 수 있는 CurrentValueSubject를 사용합니다.
  • 속성에 @Published 표기법을 추가할 수 있습니다. 이렇게 하면 해당 속성은 속성의 값이 변경될 때마다 이벤트를 내보내는 퍼블리셔를 얻습니다. 예시는 아래 링크를 보시기 바랍니다.

Published
https://developer.apple.com/documentation/combine/published

0개의 댓글