Combine

Combine - Publisher

GREEN.1229 2022. 2. 22. 10:23

안녕하세요. 그린입니다🟢

오늘부터 진행될 포스팅은 combine에 관한겁니다🙋🏻

이전에 RxSwift에 대해서는 여러 목차로 순차적으로 진행한적이 있습니다! 그것과 유사하게 combine도 한번 쉬운것부터 차근차근

정리해보면 어떨까해서 시작하게 되었습니다🙌

 

사실 현업에서 계속 swiftUI와 더불어 비동기 이벤트 처리를 위해 combine을 사용하고 있는데,

막상 combine에 대해서 포스팅한건 RxSwift와 비교하고 대략적으로 이러한거다~라고 개념만 소개했던것 같더라구요🥲

(궁금하신분은 아래 포스팅을 참고해주세요!)

https://green1229.tistory.com/137

 

Combine

안녕하세요. 그린입니다🟢 이번 포스팅에서는 Combine에 대해 학습해보겠습니다🧑🏻‍💻 Combine을 알기전! MVVM 패턴을 따르기 위해 스토리보드 작업 대신 SwiftUI를 사용하면서 RxSwift로 구현을 해

green1229.tistory.com

그래서! 이참에 서론에도 말했듯 아주 쉬운~거부터 하나씩 천천히 포스팅으로 까보죠!

 

오늘의 주제는 Publisher입니다.

사실 크게 combine을 다룬다면 publisher, subscriber, subject, scheduler, cancellable로 구성되는데 여기서 가장 첫 시작점을 publisher로 가겠습니다😀

이번 Publihser와 Subscribe를 정리함에 있어 naljin님의 블로그가 굉장히 유용한 레퍼런스가 되었습니다!

https://sujinnaljin.medium.com/combine-subscribe-1f09ce19477d

 

[Combine] Subscribe

구독하기🕵🏻‍♀️

sujinnaljin.medium.com

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

 

Apple Developer Documentation

 

developer.apple.com

https://sujinnaljin.medium.com/combine-subscribe-1f09ce19477d

 

[Combine] Subscribe

구독하기🕵🏻‍♀️

sujinnaljin.medium.com