내부 동작 과정
구독이 형성되고 Publisher 가 전달하는 값
1.
Subscriber → Publisher -subscribe<S>(_) :
Subscriber 가 자기자신을 Publisher 에게 subscribe<S>(_ subscriber: S) 를 통해 전달
2.
Publisher - subscribe<S>(_) → Publisher - receive<S>(subscriber: S) :
Subscriber 메서드가 receive(subscriber: ) 메서드를 호출, subscriber 를 publisher 에 붙여서
Subscription 을 생성함
3.
Publisher - receive<S>(subscriber: S) → Subscriber - receive(subscription: Subscription) :
Publisher 가 생성된 subscription 을 Subscriber 에게 전달.
4.
Publisher → Subscriber - receive(_ input: Self.Input) -> Subscribers.Demand :
Publisher 가 Subscriber 의 receive(_ input: Self.Input) -> Subscribers.Demand 메서드를 호출해서
Value 를 전달함.
5.
Publisher → Subscriber - receive(completion: Subscribers.Completion<Self.Failure>)
Completion 을 전달해 구독을 취소한다.
이떄 구독 취소의 사유로 에러타입을 같이 전달할 수 있다.
public protocol Publisher {
associatedtype Output
associatedtype Failure : Error
func receive<S>(subscriber: S) // 2
where S: Subscriber,
Self.Failure == S.Failure,
Self.Output == S.Input
}
extension Publisher {
public func subscribe<S>(_ subscriber: S) // 1
where S : Subscriber,
Self.Failure == S.Failure,
Self.Output == S.Input
}
Swift
복사
public protocol Subscriber: CustomCombineIdentifierConvertible {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription) // 3
func receive(_ input: Self.Input) -> Subscribers.Demand // 4
func receive(completion: Subscribers.Completion<Self.Failure>) // 5
}
Swift
복사
func receive(_ input: Self.Input) -> Subscribers.Demand
Demand 즉, 받고자하는 값의 최대 개수를 동적으로 수정해줄 수 있다.
max = 이전 max + 새 max
로 재설정된다.
예를 들어 현재 max 가 5 일 때, .Demand 값으로 3 을 리턴하게되면, 새로운 max 는 8 이된다.
이렇게 변경된 받고자하는 값의 최대개수는
public protocol Subscription: Cancellable, CustomCombineIdentifierConvertible {
func request(_ demand: Subscribers.Demand)
}
Swift
복사
request 메서드의 파라미터에 담겨 Publisher 에게 전달된다.
이로써 Subscriber 가 원하는 만큼만 값이 오도록 할 수 있으며, 추가로 max 값에는 음수가 저장될 수 없어, max 값을 감소시킬 수는 없다