Publisher는 직역하면 발행자입니다.
데이터 스트림이나 이벤트를 생성하고 이것을 Subscriber(구독자) 에게 직접 전달하는 역할을 하는 객체입니다.
애플 공식문서에는
타입이 시간 경과에 따라 일련의 값을 전송할 수 있음을 선언합니다.
다시말해, 구독자와 같은 하나이상의 관계자에게 시간이 지남에 따라서 값을 보내는(전달하는) 타입 입니다.
관심있는 값이나 이벤트를 게시 (Publish) 하게 되는것이죠!
데이터 스트림
Publisher에서 연결되어 Subscriber까지 이어지는 데이터의 흐름이 생기는 일련의 과정을 Data Stream(데이터 스트림) 이라고 합니다.
다시말해, 시간에 따라 연속적으로 발생하는 데이터 시퀸스입니다. 즉, 순차적으로 처리되거나 관찰됩니다.
UpStream, DownStream
데이터 스트림은 업스트립(UpStream) 과 다운스트림(DownStream)으로 구성되는데,
업스트림은 데이터 소스 발생지, 다운 스트림은 데이터가 처리되고 소비되는 지점 입니다.
즉 유튜버가 영상을 올리는것은 UpStream
영상을 구독해서 보는 구독자들은 DownStream
으로 생각해볼수 있습니다!
만약 여러개의 Publisher가 있다면 하위 Publisher는 상위 Publisher에 대해 다운스트림이 될 수 있습니다. (상대적일수 있는것)
구독의 종료
유튜버와 구독자 관계와 Publisher과 Subscriber의 관계가 항상 동일한 개념인것은 아닙니다.
Publisher은 발행을 종료하는 시점이 분명하기 떄문입니다.
- 모든 데이터를 발행했을 때 완료 이벤트를 발행하여 구독을 종료하고 .finished 이벤트 발행.
- 작업 중 오류를 만날 때 Failure를 발행하고 .failure 이벤트와 함께 스트림 종료.
- Subscriber가 명시적으로 구독을 취소했을 때 특별한 종료 이벤트 없이 구독 종료.
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 을 가지고 있어야합니다.
Output은 Publisher가 발행할 종류(타입)이며 Output으로 사용 될 타입이 확정되면 변경할 수 없습니다.
Failure은 Publisher가 발행할 수도 있는 에러입니다. (The kind of errors this publisher might publish.)
func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
receive 메서드는 Publisher가 **Subscriber**을 받을 때 호출되며 Publisher가 Subscriber에게 Subscription 인스턴스를 전달하면서 구독을 시작하게 됩니다!
extension Publisher {
func subscribe<S>(_ subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
func subscribe<S>(_ subject: S) -> AnyCancellable where S : Subject, Self.Failure == S.Failure, Self.Output == S.Output
}
해당 메서드들은 Publisher가 특정 Subscriber 타입의 인스턴스를 구독자로 받아들이고, 데이터 스트림의 발행이 시작됩니다.
즉, subscrib는 구독 프로세스의 시작점이고 내부적으로는 receive 메서드가 호출되게 되면서, 실제 구독을 활성화하고 본격적인 작업을 시작할수 있습니다.
Ref)
https://medium.com/@bbuyo/뿌요와-함께하는-combine-publisher-f78d44215ff5
'IOS - Swift > Combine' 카테고리의 다른 글
[iOS/Combine] Combine - Error Handling (0) | 2024.12.12 |
---|---|
[iOS/Combine] Transforming Operators (4) | 2024.12.05 |
subscription의 이해 (0) | 2024.11.25 |
Publisher - Just, Empty, Failure (1) | 2024.10.03 |
[iOS/Swift] Combine - 시작하기 (Publisher ,Operator, Subscriber) (1) | 2024.04.17 |