study record

[Swift] Combine이란? 본문

Swift/Combine

[Swift] Combine이란?

asong 2023. 1. 3. 08:12

iOS의 Combine은 Framework이다.

이벤트를 처리하는 operators들을 결합함으로써 비동기 이벤트들을 커스텀하게 다룬다.

iOS 13 이상에서 사용이 가능하다.

 

Overview

Combine framework는 값을 처리하기 위한 선언형 Swift API를 제공한다. 이 값들은 많은 비동기 이벤트들을 표현할 수 있다. Combine은 시간에 따라 변화할 수 있는 값들을 내보내기 위해 publishers를 선언하고, publishers로부터 이 값들을 받기 위해 subscribers를 선언한다.

 

- Publisher protocol은 시간에 따라 값을 연속으로 전달할 수 있는 타입을 선언한다. Publishers는 upstream publishers로부터 받은 값들에 행동하는 operators를 가지며, 그들을 republish할 수 있다.

- publishers의 체인 끝에, Subscriber는 그들을 받는 요소에 반응한다. Publishers는 오직 subscribers에 의해 요청받을 때만 값을 방출한다. 

 

몇몇 Foundation 타입은 그들의 기능성을 publishers를 통해 노출한다. Timer, NotificiationCenter, URLSession이 그 예다. Combine은 Key-Value Observing를 준수하는 어느 프로퍼티를 위해 내재된 publisher를 제공한다.

 

다양한 publishers의 아웃풋과 그들의 상호작용을 조합할 수 있다. 예를 들어, 텍스트 필드의 publisher로부터의 업데이트를 구독할 수 있고, URL request를 수행하기 위해 텍스트를 사용한다. 그 반응을 처리할 publisher를 사용하여 앱을 업데이트시킬 수 있다.

 

Combine을 채택함으로써, 이벤트 처리 코드를 중심으로 구성, 중첩 클로저와 컨벤션 베이스 콜백 같은 문제가 있는 기술을 제거함으로써, 읽고 유지하기 쉬운 코드를 만들 수 있다.

 

 

간략하게 중요 개념을 정리하고 가보자.

Publisher, Subscriber, Subject, Scheduler, Cancellable

 

Publisher

protocol Publisher<Output, Failure>

Publihser는 Subscriber 인스턴스에게 요소를 전달한다. subscriber의 InputFailure 연관값은 publisher의 OutputFailure 타입과 매치되어야 한다. publisher는 subscriber를 받아들이기 위해 receive(subscriber:)메서드를 시행한다.

 

 

Subscriber

protocol Subscriber<Input, Failure> : CustomCombineIdentifierConvertible

Subscriber는 publisher로부터 input을 받을 수 있는 타입으로 선언된 protocol이다.

 

Subscriber 인스턴스는 Publisher로부터 요소들의 stream을 받는다. subscriber의 Input Failure는 publisher의 OutputFailure와 매치되어야 한다.

 

publisher의 subscribe(_:)를 호출함을 통해 subscriber를 publisher에 연결할 수 있다. 이 호출 후에, publisher는 subscriber의 receive(subscription:) 메서드를 부른다. 이것은 subscriber에게 publisher로부터 요소를 요구하거나 선택적으로 구독을 취소하는 Subscription 인스턴스를 주는 것이다. subscriber가 처음 요구를 하면, publisher는 receive(_:)를 호출하여 새로 publish된 요소를 전달한다.

 

Combine은 subscribe할 수 있는 다음의 operator를 제공한다.

- sink(receiveCompletion:receiveValue:)  

   completion signal을 받을 때 클로저를 실행. 각 요소를 받을 때마다 실행됨.

- assign(to:on:)

   주어진 인스턴스에 key path에 의해 확인된 프로퍼티에 새롭게 받은 값을 쓴다.

 

* 자세한 publisher 구독하는 법 예제 및 설명은 다음 글(?)에 작성해보도록 하겠습니당

 

Subject

protocol Subject<Output, Failure> : AnyObject, Publisher

Subject는 바깥으 호출자들이 요소들을 방출하기 위한 메서드들을 노출하는 publisher이다. (크게 와닿지 않는 정의..)

subject는 스트림으로 값들을 주입하기 위해 사용할 수 있는 publisher이다. send(_:) 함수를 호출함으로써 사용가능하다.

 

Subject는 publisher의 일종이다. 차이점은 밖에서 값을 방출할 수 있다는 것이다. 

종류에는 PassthroughSubjectCurrentValueSubject가 있다.

 

 

Scheduler

protocol Scheduler<SchedulerTimeType>

클로저를 언제 어떻게 실행할 것임을 정의하는 프로토콜.

가능한 빨리 또는 미래에 코드를 실행하고자 스케줄러를 사용할 수 있다.

 

Cancellable

protocol Cancellable

취소를 지원하는 활동 및 액션을 지칭하는 프로토콜

cancel() 메서드를 호출하는 것은 할당된 자원을 해제시킨다. 타이머와 네트워크 접근 및 disk I/O같은 사이드 이펙트를 멈추게 한다.

 

.sink로 이벤트를 구독하면 AnyCancellable이 얻어지는데 이 값을 가지고 cancel()하여 언제든지 구독을 취소시킬 수 있다.

RxSwift의 disposeBag마냥 사용할 수 있는 개념인 것 같다. 이를 위해서는 store(in:)메서드를 사용해야 한다.

 

추후 더 공부해서 정리해야겠다!

 

 

 

참고

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

 

Apple Developer Documentation

 

developer.apple.com

- https://zeddios.tistory.com/925

 

Combine (1) - Publisher, Subscriber

안녕하세요 :) Zedd입니다. 이번 휴가동안 SwiftUI를 좀 해볼라하는데 Combine모르면 이거 걍 노답임.... -> 휴가 끝나버렸죠? 2020년 되버렸죠??????;; 그래서 Combine공부.. Combine Combine이 너무 핫했어서..그

zeddios.tistory.com

- https://sujinnaljin.medium.com/combine-subject-a974340cb582

 

[Combine] Subject

PassthroughSubject와 CurrentValueSubject⛹🏻‍♀️

sujinnaljin.medium.com

 

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

[Combine] 1. Hello Combine!  (1) 2024.08.28
[Swift Combine] Future, Deferred  (0) 2024.03.31