ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Combine 구성요소 Publisher
    IOS/Combine 2024. 3. 10. 20:07

    지난 1편은 Combine의 맛보기를 보았고 이제 본격적으로 Combine의 Publisher , Subscription, Subscriber, Operator부터 시작해 다양한 Operator를 공유하려 합니다.

     

    1편은 요기 링크 걸어둘게요!!! 못 보신분은 보고 오시는 걸 추천드립니다.

    2024.03.03 - [IOS/Combine] - Combine Framework란?

     

    Combine Framework란?

    최근 Swift Combine에 대해서 관심이 생겼고 정리겸 지식을 공유하고자 이렇게 글을 작성합니다. 앞으로 주 단위로 콤바인에 대해 알아보는 시간을 가져볼태니 궁금한 점이나 오타, 잘못된 부분은

    jjunbbang.tistory.com

     

    Combine은 "시간의 흐름에따라 방출되는 'Value'를 선언형 형태로 핸들링 하는 것을 API로 제공하는 프레임워크이다." 라고 지난 시간에 언급 드렸는데요 이에 대해 설명하면서 Combine의 구성요소인 Publisher, Subscription,  Subscriber를 설명하지 못했어요. 컴바인의 핵심 요소고 Combine 프레임워크를 사용하려면 반드시 이해해야 하는 만큼 먼저 설명드리도록 하겠습니다.

     

    1. Publisher 

     

    Publisher는 Protocol입니다. 내부적으로 동작 구현은 별도로 구현되어 있겠지만, 표면적으로는 프로토콜로 정의되어 있습니다.
    Apple developer document에 따르면 시간에 따라 순서적으로 방출할 수 있는 값의 유형을 Publisher라고 합니다. Publisher 프로토콜의 소스 코드를 보면 다음과 같아요.

    public protocol Publisher<Output, Failure> {
    
        /// The kind of values published by this publisher.
        associatedtype Output
    
        /// The kind of errors this publisher might publish.
        ///
        /// Use `Never` if this `Publisher` does not publish errors.
        associatedtype Failure : Error
    
        /// Attaches the specified subscriber to this publisher.
        ///
        /// Implementations of ``Publisher`` must implement this method.
        ///
        /// The provided implementation of ``Publisher/subscribe(_:)-4u8kn``calls this method.
        ///
        /// - Parameter subscriber: The subscriber to attach to this ``Publisher``, after which it can receive values.
        func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
    }

     

    Output과 Failure의 경우 associatedType으로 선언 되어있습니다. 이러면 Publisher 프로토콜을 conform하는 인스턴스의 타입에 따라 데이터 타입이 달라지겠죠? 

    예를들어 [1,2,3,4] Int타입의 sequence를 순차적으로 값을 방출해볼게요. Output타입은 어떻게 바뀔까요?

    //PlayGround에서 실행
    
    let publisher = [1, 2, 3, 4].publisher
    
    publisher.sink { value in
        print(value)
    }

    결과

     

    publisher의 타입을 보면 다음과 같아요 Output이 '[Int]'로 타입이 명시되어 있는걸 볼 수 있습니다. 그렇다면 Failure type Never은 뭘까요?

     

    Failure의 경우 Publisher가 에러를 발생할 일이 없다면 Never을 사용할 수 있습니다. 반면 Error 프로토콜을 conform해 custom한 에러를 방출 하는 publisher도 만들 수 있습니다.

     

    위 예제처럼 배열을 사용해 Publisher를 만들었습니다. 하지만 해당 Publisher가 언제 끝나는지는 아직 언급을 안 했는데요! 위 예제코드에서 .print operator를 사용해 publisher가 어떤 이벤트를 받는지 알아볼게요 

    let publisher = [1, 2, 3, 4].publisher
    
    publisher
        .print()
        .sink { value in
            print(value)
        }

    콘솔에서 맨 마지막에 receive finished가 있는데, 해당 Publisher는 [1,2,3,4] 값들이 모두 방출되면  종료 이벤트를 받게됩니다.

     

    간단하게 Publisher가 뭔지 알아봤는데요, 

    다음 시간엔 Subscriber에 대해 알아보겠습니다.

    'IOS > Combine' 카테고리의 다른 글

    Combine Operators 1 (transforming)  (0) 2024.04.13
    Combine Cancellable, subscription  (0) 2024.04.07
    Combine - Subscriber 2편  (0) 2024.03.30
    Combine - Subscriber 1편  (0) 2024.03.16
    Combine Framework란?  (0) 2024.03.03
Designed by Tistory.