study record
[Swift] Combine이란? 본문
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의 Input과 Failure 연관값은 publisher의 Output과 Failure 타입과 매치되어야 한다. publisher는 subscriber를 받아들이기 위해 receive(subscriber:)메서드를 시행한다.
Subscriber
protocol Subscriber<Input, Failure> : CustomCombineIdentifierConvertible
Subscriber는 publisher로부터 input을 받을 수 있는 타입으로 선언된 protocol이다.
Subscriber 인스턴스는 Publisher로부터 요소들의 stream을 받는다. subscriber의 Input과 Failure는 publisher의 Output과 Failure와 매치되어야 한다.
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의 일종이다. 차이점은 밖에서 값을 방출할 수 있다는 것이다.
종류에는 PassthroughSubject와 CurrentValueSubject가 있다.
Scheduler
protocol Scheduler<SchedulerTimeType>
클로저를 언제 어떻게 실행할 것임을 정의하는 프로토콜.
가능한 빨리 또는 미래에 코드를 실행하고자 스케줄러를 사용할 수 있다.
Cancellable
protocol Cancellable
취소를 지원하는 활동 및 액션을 지칭하는 프로토콜
cancel() 메서드를 호출하는 것은 할당된 자원을 해제시킨다. 타이머와 네트워크 접근 및 disk I/O같은 사이드 이펙트를 멈추게 한다.
.sink로 이벤트를 구독하면 AnyCancellable이 얻어지는데 이 값을 가지고 cancel()하여 언제든지 구독을 취소시킬 수 있다.
RxSwift의 disposeBag마냥 사용할 수 있는 개념인 것 같다. 이를 위해서는 store(in:)메서드를 사용해야 한다.
추후 더 공부해서 정리해야겠다!
참고
- https://developer.apple.com/documentation/combine
- https://zeddios.tistory.com/925
- https://sujinnaljin.medium.com/combine-subject-a974340cb582
'Swift > Combine' 카테고리의 다른 글
[Combine] 1. Hello Combine! (1) | 2024.08.28 |
---|---|
[Swift Combine] Future, Deferred (0) | 2024.03.31 |