-
Combine - PublisherCombine 2022. 2. 22. 10:23
안녕하세요. 그린입니다🟢
오늘부터 진행될 포스팅은 combine에 관한겁니다🙋🏻
이전에 RxSwift에 대해서는 여러 목차로 순차적으로 진행한적이 있습니다! 그것과 유사하게 combine도 한번 쉬운것부터 차근차근
정리해보면 어떨까해서 시작하게 되었습니다🙌
사실 현업에서 계속 swiftUI와 더불어 비동기 이벤트 처리를 위해 combine을 사용하고 있는데,
막상 combine에 대해서 포스팅한건 RxSwift와 비교하고 대략적으로 이러한거다~라고 개념만 소개했던것 같더라구요🥲
(궁금하신분은 아래 포스팅을 참고해주세요!)
https://green1229.tistory.com/137
그래서! 이참에 서론에도 말했듯 아주 쉬운~거부터 하나씩 천천히 포스팅으로 까보죠!
오늘의 주제는 Publisher입니다.
사실 크게 combine을 다룬다면 publisher, subscriber, subject, scheduler, cancellable로 구성되는데 여기서 가장 첫 시작점을 publisher로 가겠습니다😀
이번 Publihser와 Subscribe를 정리함에 있어 naljin님의 블로그가 굉장히 유용한 레퍼런스가 되었습니다!
https://sujinnaljin.medium.com/combine-subscribe-1f09ce19477d
Publisher?
해당 의미만 놓고 보면 무언가를 직역하는 발행자라는 의미로 쓰입니다.
사실 그런 의미로 사용되는것도 맞구요.
시간 흐름에 따라 값 시퀀스의 변화 흐름을 Subscriber에게 발행 즉 전송해주는 역할을 해줍니다.
즉 하나 혹은 여러개의 Subscriber에게 값 요소를 제공합니다.
저는 굉장히 notification의 용어와 개념과 비슷하다고 생각했어요🤔
Publisher가 발행하는 Output과 Failure 타입은 Subscriber의 Input과 Failure 타입과 동일해야 합니다.
같은 타입을 보내고 같은 타입을 받아야하는 당연한 이치일것 같아요!
Publisher가 Subscriber에게 구독을 가지고 소통하는 기본 3대장 메서드
1. receive(subscription:)
이 메서드는 subscriber가 publisher를 구독 즉 subscribe(_:)하게 되면 Publisher측에서 호출하게됩니다.
흐름상 보면 subscribe하여 구독을 요청하게 됩니다.
그러면 receive(subscriber:)가 호출되고 receive(subscription:)를 통해 subscription이라는 구독권을
발행하게됩니다.
또한 subscription을 설정하며 방출되는 값은 얼마만큼 최대로 받을지 같은 조건들도 같이 설정합니다.
쉽게 생각해보면 구독권에도 베이직, 프리미엄 있듯이 그런 과정이라고 보면 됩니다.
구독을 요청했으니 구독권을 Subscriber에게 줘야겠죠?
이 subscription을 subscriber에게 보내줍니다.
즉 정리하자면, 구독자가 구독을 요청했고 그걸 처리해서 구독권을 만들어 구독할 수 있게 구독자에게
구독권을 전달하는 과정이라고 보면 될것 같아요!
(구독 구독 거려서 조금 헷갈리네요🥲🙏🏻)
2. receive(_:)
위에서 말했듯 얼마만큼의 값을 받을지에 대해서는 subscriber에서 request(_:)를 통해 요청합니다.
그러면 그에 따라 publisher에서 receive(_:)를 호출해 subscriber에게 요청한 갯수의 값을 전달해줍니다.
서비스를 제공하는거라고 보면 됩니다!
3. receive(completion:)
publisher에서 제공하는 값이 끝남 혹은 에러가 난다면 이를 subscriber에게 알려줘야합니다.
그때 이 receive(completion:) 메서드를 이용합니다.
구독자가 구독이 끝나거나 어떤 비정상적으로 종료가 되었을때 알려줘야하는 의무가 있듯이 동일한 맥락입니다.
Publisher와 Subscriber 사이 구독 흐름
참고자료의 naljin님의 흐름도를 기반으로 재해석했습니다!
Publisher & Subscriber 구현하기
let customPublisher = (1...10).publisher class CustomSubscriber: Subscriber { func receive(subscription: Subscription) { subscription.request(.max(5)) } func receive(_ input: Int) -> Subscribers.Demand { print("value is \(input)") return .none } func receive(completion: Subscribers.Completion<Never>) { print("Finished") } } let customSubscriber = CustomSubscriber() customPublisher.subscribe(customSubscriber)
우선 1~10까지 Int값을 방출하는 Publisher를 만듭니다.
그다음 커스텀한 Subscriber 타입을 만들어줍니다.
그 안에서 필수 3가지 메서드를 구현해줍니다.
1. receive(subscription:)
이 메서드로 request 메서드를 이용해 최대 몇개의 값을 받을지 정해줍니다.
2. receive(_:)
이 메서드에서 받은 값을 가지고 취할 액션을 구현합니다.
3. receive(completion:)
이 메서드에서 구독으로 인한 값 수신이 다 완료됨을 수신 확인했을때의 액션을 구현해줍니다.
자..! 돌려보면!
value is 1 value is 2 value is 3 value is 4 value is 5 Finished
이렇게 당연하게 나타남을 알 수 있습니다.
아주 간단하니 직접 해보심을 추천드립니다🙌
마무리
간단한거 같았는데 생각보다 흐름이 조금 러닝커브는 있다고 생각은 합니다🙋🏻
그래도 흐름 기초부터 잘 이해하면 이후는 쉽게 적용만 하면되서 문제 없을거에요!
다같이 화이팅입니다ㅎㅎ
[참고자료]
https://developer.apple.com/documentation/combine/publisher
https://sujinnaljin.medium.com/combine-subscribe-1f09ce19477d
'Combine' 카테고리의 다른 글
Combine - Cancellable (2) 2022.03.10 Combine - Scheduler (0) 2022.03.07 Combine - Subject (0) 2022.02.28 Combine - Subscriber (0) 2022.02.24 Combine (0) 2021.06.09