Search
🥡

Combine 내부 동작 과정 + 내부 코드

내부 동작 과정

구독이 형성되고 Publisher 가 전달하는 값
1.
SubscriberPublisher -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
로 재설정된다.
예를 들어 현재 max5 일 때, .Demand 값으로 3 을 리턴하게되면, 새로운 max8 이된다.
이렇게 변경된 받고자하는 값의 최대개수는
public protocol Subscription: Cancellable, CustomCombineIdentifierConvertible { func request(_ demand: Subscribers.Demand) }
Swift
복사
request 메서드의 파라미터에 담겨 Publisher 에게 전달된다.
이로써 Subscriber 가 원하는 만큼만 값이 오도록 할 수 있으며, 추가로 max 값에는 음수가 저장될 수 없어, max 값을 감소시킬 수는 없다