Publisher
protocol
순차적으로 값의 시퀀스를 전달할 수 있는 타입 선언.
Declaration
protocol Publisher
Overview
publisher는 여러개의 subscriber instance에 요소를 전달한다.
subscriber의 Input, Failure 타입은 publisher의 Output과 Failure와 일치해야한다.
publisher는 subscrebier를 허용하기 위해 receive(subscriber:) 메소드를 구현한다.
그 후에, publisher는 아래의 subscriber의 메소드를 호출 할 수 있다.
- receive(subscription:)
- 구독이 성공 됐음을 알려주고, Subscription instance를 리턴.
- subscription은 publisher에게 요소를 요청하거나, 구독을 취소할 때 사용한다.
- receive(_:)
- publisher는 subscriber에게 하나의 요소를 전달한다.
- receive(completion:)
- 성공 혹은 실패고 publishing이 끝났다고 subscriber에게 알린다.
정상적으로 동작하려면 모든 publisher는 downstream subscriber를 위해 이 조건을 준수해야한다.
publisher extension은 이벤트 처리 체인을 정교하게 만드는 많은 종류의 연산자를 정의한다.
각 연산자는 Publisher protocol을 구현하는 형식으로 반환한다.
이 타입 대부분은 Publishers enum의 extension으로 존재한다.
예를 들어, map( _ :) 연산자는 Publishers.Map 인스턴스를 반환한다.
Creating Your Own Publishers
Publisher protocol로 커스텀 publisher를 만드는 것보다, Combine 프레임워크에서 제공해주는 타입을 이용해서 publisher를 사용하는걸 권장한다.
- PassthroughSubject과 같이 Subject를 상속받아서 사용. send( _ :) 메소드를 호출해서 요청에 따라 값을 publish.
- CurrentValueSubject는 subject의 기본 값을 업데이트 될 때마다 사용.
- property에다가 @Published 기입. property 값이 변경될 때마다 이벤트를 송출하는 publisher 획득 가능. Published 참고.
지극히 주관적으로 이해하기
구독하기
- 요구사항에 따른 publisher들을 생성.
- 각 publisher는 요구사항에 맞게 연산함.
- 요구사항에 맞게 publisher들을 나열함. » 요구사항에 따라 publisher가 많을 수도 있고 적을 수도 있다.
- 나열된 순서대로 publisher가 수행될 예정. > 이것을 publihser chain이라고 함.
- upstream publihser : 바로 내 위에서 수행되는 publisher.
- downstrem publihser : 나 다음으로 수행될 publisher.
- sink 또는 assign 메소드로 publisher를 구독할 subscriber 생성.
- sink와 assign은 publisher 메소드. subscriber를 리턴한다.
- publisher chain의 끝은 subscriber가 되야한다.
이벤트 처리
- 이벤트 발생
- publisher chain 실행.
- publisher chain에 따라 나열된 순으로 차례대로 publisher 실행.
- publishr는 upstream publisher부터 받은 값으로 계산을 하고 새로운 Ouput과 함께 publisher(downstrem publisher)를 리턴한다.
- publisher chain의 끝에서 subscriber에게 최종 결과 값 전달.
Topic
Declaring Publisher Topography
- publisher는 꼭 Output과 Failure 타입을 정의해야한다.
- associatedtype Output
- associatedtype Failure
//NotificationCenter.Publisher 의 예
extension NotificationCenter {
/// A publisher that emits elements when broadcasting notifications.
public struct Publisher : Publisher {
/// The kind of values published by this publisher.
public typealias Output = Notification
/// The kind of errors this publisher might publish.
///
/// Use `Never` if this `Publisher` does not publish errors.
public typealias Failure = Never
}
}
Leave a comment