iOS SwiftUi Combine 기초
포스트
취소

iOS SwiftUi Combine 기초

안녕하세요. narvis2 입니다.
이번시간에는 iOS에서 비동기를 처리할때 사용되는 Combine에 대하여 알아보고자 합니다.

🍀 Combine


  • Event 처리를 위한 선언적 접근을 합니다.
  • DelegateCompletion Handler 구현 대신 Event 소스에 대한 Single processing chain을 만들 수 있습니다.
  • Apple 버전의 RxSwift
  • 시간의 흐름에 따라 값을 처리하기 위한 Declarative Swift API를 제공하는 프레임워크
  • Combine으로 할 수 있는 대표적인 작업
    • 1️⃣ 필드에 입력한 값이 유요한 경우에만 Submit버튼이 활성화되도록 설정
    • 2️⃣ 비동기작업을 수행하고 반환된 값을 사용하여 ViewUpdate할 방법과 대상을 선택할 수 있음
    • 3️⃣ 사용자가 텍스트필드에 동적으로 입력하고 입력한 내용을 기반으로 사용자 인터페이스 ViewUpdate
  • ✅ 장점
    • 1️⃣ System Level에 통합되어 있음.
    • 2️⃣ delegate, closure를 만들 필요 없음.
    • 3️⃣ 동일한 interface를 쓰기 때문에 재사용성이 좋음.
    • 4️⃣ operator를 조합하기 좋음.
    • 5️⃣ 비동기 코드에서도 비즈니스 로직에 집중할 수 있음.
  • Combine의 3가지 주요 부분
    • Publisher
    • Operator
    • Subscriber
  • Key points
    • Combine은 비동기 Event를 위한 선언적, 반응형 프레임워크
    • 비동기 프로그래밍의 기존 문제를 해결하는 것이 목표
    • 주요 3 타입 흐름 : publisher(Event 발행) 👉 operator(Event처리, 조작) 👉 subscriber(결과물 소비)

☘️ Publisher

  • value들을 내보내는(emit) 역할
  • Publisheremit할 수 있는 Event 종류
    • 1️⃣ Output
    • 2️⃣ Completion : successful completion
    • 3️⃣ Failure : completion with an error
  • 참고

    • PublisherOutput을 안보내고 있거나 여러번 보낼 수 있으며, Completion이나 Failure를 한번 보내고 나면 더 이상의 Event를 보낼 수 없음
    • 구독이 없는 경우 Publisher는 데이터를 제공하지 않음
  • 특징
    • 1️⃣ 3가지 Event 모든 종류의 동적 데이터를 표현 가능
    • 2️⃣ delegate를 추가하거나 completion callback 주입이 필요 없음
    • 3️⃣ Publishererror handling이 내장
    • 4️⃣ Publisher는 2개의 Generic을 기반으로 구성
      • Generic 첫 번째 Publisher.Ouput 👉 output value
      • Generic 두 번째 Publisher.Failure 👉 Error전달, Error가 발생할 일이 없으면, Never라는 type으로 정의하면 됨

☘️ Operator

  • Event를 처리하고, 조작하는 역할
  • Publisher Protocol에 선언되어 있음
  • 같거나 새로운 Publisher를 반환하는 메소드
  • Operator를 체이닝해서 사용할 수 있기 때문에 유용함
  • 장점
    • 1️⃣ Operator들은 독립적이고 조합가능 하기 때문에, 복잡한 로직을 구현하는데 조합(Combine) 가능.
    • 2️⃣ 항상 Input & Output(Upstream & DownStream)을 가지기 때문에 shared state를 피할 수 있음.

      즉, 동시성 이슈로 인해 비동기 코드가 끼어들어 데이터를 중간에 변경할 일이 없음

☘️ Subscribers

  • 결과물을 소비하는 역할
  • 전달받은 valuecompletion event로 작업을 수행
  • 모든 구독은 subscriber로 끝남
  • ✅ 2개의 내장된 subscriber
    • 1️⃣ sink 👉 output valuecompletion을 받을 수 있는 클로저를 제공할 수 있음.
      • receiveCompletion 👉 stream이 성공, 실패로 종료되었음을 알려줌
      • receiveValue 👉 값을 받을 때 실행되는 Closure
    • 2️⃣ assign 👉 outputkey path를 통해 data modelpropertyUI control에 바로 binding할 수 있음.

☘️ Subscriptions

  • publisher, operator, subcriber의 전체 chain
  • ✅ 중요
    • subscription의 끝에 subscriber를 추가 👉 chainning의 맨 앞에 있는 publisher를 활성화
    • output을 수신해줄 subscriber가 없으면 publisher는 어떤 value도 전달하지 않음
  • ✅ 장점
    • 1️⃣ Subscription은 비동기 Event들의 ChainCustom 코드와 Error handling과 함께 한번에 선언 가능
    • 2️⃣ Full-Combine이면, 앱 전체의 로직을 subscription들로 표현 가능
    • 3️⃣ Subscription이 한번 선언되고 나면 Callback을 호출할 필요 없이 System이 다 알아서 해줌

☘️ 메모리 관리

  • Cancellable Protocol을 사용해서 메모리 관리
  • Subscriber들은 Cancellable을 준수하고 있음
  • Object를 메모리에서 해제 👉 모든 subscription은 취소 👉 리소스를 메모리로부터 해제
  • subscirber가 더 이상 값을 받을 필요 없을 때 cancel() 사용

    ❗️ cancel()을 직접 호출하지 않으면, deinit될 때까지 구독됨

  • ✅ 장점
    • 1️⃣ Subscription의 수명을 View Controller같은 Objectbinding 기능
    • 2️⃣ 유저가 View ControllerView Stack에서 dismiss 👉 subscription 취소 해줌
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.