위 포스팅을 미리 보고오시면 이해에 도움이 됩니다.
일반적으로 Combine 코드를 커스터마이징해서 사용하고자 한다면,
Publisher 를 커스터마이징 하는 것 보다.
Subscriber 를 커스터마이징하는 것이 쉽다.
Custom Subscriber 예제 코드
example(of: "Custom Subscriber") {
let publisher = (1...6).publisher
final class IntSubscriber: Subscriber {
// 1.
typealias Input = Int
typealias Failure = Never
func receive(subscription: Subscription) { //2.a
subscription.request(.max(3))
}
func receive(_ input: Int) -> Subscribers.Demand {//2.b
print("Received value", input)
return .none
}
func receive(completion: Subscribers.Completion<Never>) {//2.c
print("Received completion", completion)
}
}
}
Swift
복사
커스텀 Subscriber 를 만드는 방법은 아래와 같습니다.
1.
Input 타입과 Failure 타입을 지정해준다.
2.
3개의 receive 함수를 구현해준다.
a.
receive(subscription: Subscription)
해당 메서드에는 publisher 에서 생성되어 리턴된 subscription 이 담겨져 있습니다
subscription 의 request 메서드를 사용해 받고자하는 값의 최대개수를 지정해줄 수 있습니다.
b.
receive(_ input: Int) -> Subscribers.Demand
최대 max 값을 동적으로 수정할 수 있는 메서드입니다.
수정하지 않고자 한다면 .none 을 리턴해줍시다
c.
receive(completion: Subscribers.Completion<Never>)
publisher 에서 발행된 completion 이벤트에 대응하는 코드를 작성해주면됩니다
3.
커스텀 subscriber 의 객체를 생성하여 publisher 에 붙여준다.
let subscriber = IntSubscriber() //3.
publisher.subscribe(subscriber)
Swift
복사
이때, publisher 의 Output, Failure 타입과 커스텀해준 subscriber 의 Input, Failure 타입은 같아야 한다.
아래 코드를 보면 completion 이벤트는 전달되지 않는 모습을 볼 수 있다.
Received value 1
Received value 2
Received value 3
Swift
복사
이는 받고자하는 값의 개수가 3개로 fix 되어 있기 때문에,
publisher 가 발행하고자 하는 값인 1,2,3,4,5,6, completion 중 1,2,3 까지만 발행을 한 모습이다.
func receive(_ input: Int) -> Subscribers.Demand {//2.b
print("Received value", input)
return .none
}
Swift
복사
해당 부분의 코드를
func receive(_ input: Int) -> Subscribers.Demand {//2.b
print("Received value", input)
return .unlimited
}
Swift
복사
로 바꾸어주면
Received value 1
Received value 2
Received value 3
Received value 4
Received value 5
Received value 6
Received completion finished
Swift
복사
completion 이벤트까지 잘 받아오는 모습이다.