ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Combine - ConnectablePublisher
    Combine 2022. 3. 28. 20:20

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

    이번 포스팅에서는 전 시간에서 multicast와 share를 학습하면서 살짝 스치듯이 말하고간

    ConnectablePublisher에 대해 학습해보겠습니다🙋🏻

     

    우선 만약 이전 포스팅인 multicast와 share를 못보셨다면 보고 오시는걸 추천해요!

    https://green1229.tistory.com/230

     

    Combine - multicast / share

    안녕하세요. 그린입니다🟢 이번 포스팅에서는 다시 컴바인 세계로 돌아와 multicast와 share에 대해 알아보겠습니다🙏🏻 우선 어떤걸 하는 친구들이냐!? 하나의 Publisher로 부터 구독을 한 여러 Subs

    green1229.tistory.com

     

    이전 포스팅에서 언급한 ConnectablePublisher에 대한 회고

    이전 포스팅에서 multicast에서 마지막 방출 처리 시 connect()를 해줘야한다했어요.

    그 이유에 대해서는 multicast를 해주면 Publishers.Multicast 타입으로 변환되고 이 Multicast 타입이 ConnectablePublisher를 채택합니다.

    결국 이 ConnectablePublisher의 특성상 connect()를 호출해야 요소 방출이 이뤄진다 했습니다.

    자 그럼 이 대목을 한번 다시 상기시키고 바로 알아보시죠🏃🏻

    ConnectablePublisher?

    공식문서의 설명을 보면 연결 가능한 게시자라고 해요.

    퍼블리싱하는 게시를 연결 및 취소할 수 있는 수단을 제공합니다.

    protocol ConnectablePublisher : Publisher

    이렇게 앞서 말했듯 Publisher를 따르는 프로토콜입니다.

    또한 connect()를 호출하지 않으면 요소 생성을 안합니다.

    makeConnectable()를 호출해서 ConnectablePublisher를 생성할 수 있어요.

    ConnectablePublisher 생성 및 사용

    해당 타입으로 만든 Publisher에서 최종적으로 요소를 방출시켜주는 방법에는 두가지가 있습니다.

    계속 언급되었던 connect()와 autoconnect() 입니다.

    그럼 하나씩 간단히 알아보면서 사용해보죠!

    connect()

    func connect() -> Cancellable

    공식문서의 정의는 이렇습니다.

    게시자에 연결해서 요소 생성을 허용하고 게시 취소할 인스턴스를 반환해줍니다.

    아까 위에서 계속 설명했던 connect()인데 이걸 해줘야 해당 Publisher에서 요소를 방출해준다고했죠?

    한번 코드로 보시죠!

    // ConnectablePublihser 생성
    let publisher = [1, 2, 3, 4, 5]
      .publisher
      .makeConnectable()
    
    let cancellable = publisher.sink(receiveValue: {
      print("Num is \($0)")
    }
    
    // 요소 방출
    publisher.connect()

    이렇게 간단히 선언과 생성을 통한 후 방출까지 해줄 수 있습니다.

    그럼 순차적으로 1, 2, 3, 4, 5의 프린트가 찍히겠네요!

    autoconnect()

    이건 connect()처럼 방출하고 싶을때 호출하지 않고 ConnectablePublisher을 생성 시 호출해줘서

    자동으로 연결 및 취소 로직을 탈 수 있도록 해주는 친구입니다!

    func autoconnect() -> Publishers.Autoconnect<Self>

    정의는 이렇습니다.

    연결 및 해제를 자동화해준다고 해요 역시!

    또한 중요한 점은 꼭 업스트림에서만 호출해줘야 자동 연결된다고 합니다.

    반환값이 업스트름 연결 가능한 게시자에 자동으로 연결되는 게시자라고 설명이 박혀있습니다!

    그럼 코드로 사용을 보시죠!

    // autoconnect 정상 사용 예시
    let publisher = [1, 2, 3, 4, 5]
      .publisher
      .makeConnectable()
      .autoconnect()
    
    let cancellable = publisher.sink(receiveValue: {
      print("Num is \($0)")
    }
    
    // autoconnect 비정상 사용 예시
    let publisher = [1, 2, 3, 4, 5]
      .publisher
      .makeConnectable()
    
    let cancellable = publisher.sink(receiveValue: {
      print("Num is \($0)")
    }
    
    publisher
      .autoconnect()

    이렇게 정상적으로 업스트림에서 호출해 사용하면 되지만 아래와 같이 업스트림이 아닌 sink 이후에 호출한다면 작동하지 않습니다.

    마무리

    이렇게 간단히 ConnectablePublisher 프로토콜에 대해 알아봤습니다!

    어떠신가요? 감이 오시나요..?

    참 combine 하면 할수록 재미는 있는것 같은데 어렵네요!

    다음엔 더 재미있고 어려운걸로 포스팅해보겠습니다🙌

    [참고자료]

    https://developer.apple.com/documentation/combine/connectablepublisher

     

    Apple Developer Documentation

     

    developer.apple.com

     

    'Combine' 카테고리의 다른 글

    Combine - multicast / share  (0) 2022.03.24
    Combine - ObservableObject / @Published / @ObservedObject  (0) 2022.03.17
    Combine - Cancellable  (2) 2022.03.10
    Combine - Scheduler  (0) 2022.03.07
    Combine - Subject  (0) 2022.02.28
Designed by Tistory.