ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Combine - Publisher
    Combine 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

    '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
Designed by Tistory.