-
Combine - SubscriberCombine 2022. 2. 24. 10:45
안녕하세요. 그린입니다🟢
이번 포스팅에서는 Combine의 Subscriber라는 것에 대해 학습해보겠습니다🙋🏻
우선 이전 포스팅에서 Publisher에 대해 알아보면서 Subscriber와 뗄레야 뗄 수 없어서
같이 설명하는 느낌이 있어서 어떻게 보면 했던 학습 반복일 수도 있습니다.
그렇지만 그보다 이번에 조금 더 Subscriber에 초점을 맞춰 학습해보려해요🚀
(Publisher에 대해 못보신 분이 있다면 아래 포스팅을 참고해주세요!)
https://green1229.tistory.com/221
Subscriber?
Subscriber는 Publisher와 반대되는 개념 및 용어로 Publisher를 구독하는 구독자라는 의미를 가집니다.
즉 Publisher로부터 입력을 받을 수 있는 형식을 선언하는 프로토콜입니다.
라이프 사이클 이벤트와 함께 Subscriber에서 스트림을 수신하게 됩니다.
protocol Subscriber : CustomCombineIdentifierConvertible
Subscriber의 공식문서를 보면 이렇게 선언되어 있어요.
즉 CustomCombineIdentifierConvertible 프토코로을 상속받습니다.
CustomCombineIdentifierConvertible?
Subscriber에서 상속받는 CustomCombineIdentifierConvertible 프로토콜이 대체 뭘까요?
Publisher 스트림을 고유하게 식별하기 위한 프로토콜이라고 합니다.
Subscriber 개발도구가 앱에서 Publisher 체인을 고유하게 식별할 수 있도록 요 프로토콜이 해내줍니다.
우선 요정도로 알아도 충분할것 같네요!
Publisher와 Subscriber 사이 값/에러 주고받기
Publisher에서 Output과 Failure를 방출해요.
즉 여기서 Output은 방출하는 값 타입이고 Failure는 방출할 수 있는 에러 타입을 나타내요.
그럼 Subscriber에서는 Input과 Failure를 가집니다.
Input은 방출된 값을 수신 받을 수 있는 값의 타입이고 Failure는 방출된 에러를 수신 받을 수 있는 에러 타입입니다.
즉 Publisher와 Subscriber 사이 유기적인것이 확인됩니다🙌
Subscriber의 메서드
Subscriber에서는 3개의 메서드가 있습니다.
해당 메서드들로 값을 수신하고 처리합니다.
이 메서드에 대해 하나씩 알아보시죠!
1. receive(subscription:)
아마 이전 포스팅에서도 다룬적이 있는데 이 메서드는 Publisher가 준 구독권을 받는것입니다.
즉 Publisher와 Subscriber를 연결하는 subscribe(_:) 함수 호출 후 Publisher가 호출하게 됩니다.
즉 위에서 말한 구독권은 Subscription이라는 인스턴스이고 이걸 Subscriber에게 전달해주는것이죠!
좀 더 자세히는 Subscription 프로토콜이 있고 그 안에 있는 request, cancel 메서드로 좀 더 구독정보에 대한
요청과 구독 취소등이 존재하는데 그건 아래에서 같이 다시 확인해보시죠!
2. receive(_:)
Publisher에서 이제 방출된 값을 Subscriber에서 받기 위해 호출되는 메서드입니다.
이전에 request 메서드를 통해 어떤 값을 얼마나 받을지와 같은 정보들이 이뤄집니다.
3. receive(completion:)
Publiser에서 정상적으로 값이 방출되었는지 혹은 에러가 났는지 노티를 주기 위해 호출하는 메서드입니다.
즉 이 메서드로 정상 혹은 에러가 Subscriber에게 전달되겠죠.
Subscription 프로토콜
Subscription은 Publisher와 Subscriber의 연결을 해주는 프로토콜입니다.
즉 구독권이라고 생각하면 좋겠네요!
Subscription은 Publisher와 Subscriber를 연결해주는 고유 식별자의 역할을 해줘야하기 때문에
오로지 클래스 객체로만 가능합니다.
Subscription의 메서드
Subscription에는 두가지 메서드가 존재합니다.
1. request(_ demand: Subscriber.Demand)
우리가 계속 다뤘던 구독권에 대한 정보 설정과 비슷합니다.
어떤 값을 받을지 얼마나 받을지를 요 메서드를 통해 이뤄집니다.
2. cancel()
Subscriber가 Publisher에서 더는 값을 수신하지 않겠다 할때 사용합니다.
해당 메서드를 통해 취소해줍니다.
만약 해당 메서드를 통해 취소해주지 않는 즉 묵시적인 취소를 한다면 Publisher에서 값이 다 방출되고
complete될때까지 Subscription 인스턴스가 계속 메모리에 남게됩니다.
마무리
이렇게 오늘도 combine의 두번째 파트인 subscriber에 대해 알아봤어요!
알고 있는걸 좀 더 자세히 정리해봤다고 할 수 있겠네요🙌
역시 딥하게 공부해보니 모르는것도 있었고 좀 더 교정이 되어서 좋았습니다!
항상 해도 어려운 공부... 화이팅!
[참고자료]
https://developer.apple.com/documentation/combine/subscriber
https://developer.apple.com/documentation/combine/customcombineidentifierconvertible
https://developer.apple.com/documentation/combine/subscription
'Combine' 카테고리의 다른 글
Combine - Cancellable (2) 2022.03.10 Combine - Scheduler (0) 2022.03.07 Combine - Subject (0) 2022.02.28 Combine - Publisher (0) 2022.02.22 Combine (0) 2021.06.09