Combine 간단한 개념들
모바일 개발에서 비동기 작업은 매우 많다 !
- 사용자의 입력 (버튼 인터랙션)
- 서버에서 데이터 받아와서 보여주기 (언제 네트워크를 통해 완료될지 모름)
Why Combine ?
- 효율적인 비동기 처리 !
- 통합된 비동기 처리 방식이 필요
일관된 방식의 비동기 처리를 할수 있는 API를 Combine으로 제공
Combine OverView
3가지 주요 컴포넌트가 존재
- Publisher : 생산자, 배출자, 크리에이터, 배설자
- Subscriber : 구독자, 소비자, 받는 사람
- Operator : 변경시키는 사람, 마법사, 가공하는 사람
Event Stream (Event Pipeline)
- Publisher -> Operator -> Subscriber
Publisher
protocol Publisher {
associatedtype OutPut
associatedtype Failure: Error
func subscribe<S: Subscriber>(_ subscriber: S) where S.input == Output
S.Failure == Failure
}
데이터를 배출하는 친구, Subscriber가 요청 한 것 만큼 data를 제공
내부 메소드인 Just
Future
가 존재한다.
- Just : 값을 다룸
- Future : 함수를 다룸
iOS에서는 자동으로 제공해주는 것들이 존재함
- Notification Center
- Timer
- URLSession.dataTask
Subscriber
protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(_ input: Input) -> Subscribers.Demand
func receive(subscription: Subscription)
func receive(completion: Subscribers.Completion<Failure>)
}
- Publisher에게 데이터 요청
- Input, Failure 타입의 정의가 필요
- Publisher 구독 후, 갯수를 요청함
- 파이프라인 취소 가능
assign, sink
존재
- assign : Publisher가 제공한 데이터를 특정 객체에 키패스에 할당
- sink : Publisher가 제공한 데이터를 받을 수 있는
Closure
제공
Subscriber & Publisher Pattern
- Subscribrer is attached to Publisher
- Publisher sends a Subscription
- Subscriber requests N Values
- Publisher sends N values or less
- Publisher sends Completion
Subscription
Subscriber 가 Publisher에게 연결됨을 나타낸다.
- Publisher가 발행한 구독 티켓
- 이것만 있으면 Data 받는게 가능
- 이게 사라지면, 구독 관계도 사라짐
Cancellable
프로토콜을 따름 -> Subscription 을 통해 연결을 취소 가능
Subject (Publisher)
Send(_:)
메소드를 이용해서 이벤트 값을 주입 시킬 수 있는 퍼블리셔
- 기존의 비동기 처리 방식에서 Combine으로 전환 시 유용하다.
- PassthroughSubject
- Subscriber가 달라고 요청하는 순간 부터 받은 값을 전달 한다. 전달한 값을 들고 있지 x
- CurrentValueSubject
- Subscriber가 달라고 요청하면, 최근에 가지고 있던 값 전달 후 그때 부터, 받은 값을 전달함. 전달한 값을 들고 있다.
@Published (Publisher)
프로퍼티를 퍼블리셔로 만들어 준다. 클래스에 한해서 사용이 가능하고, $
를 이용해서 퍼블리셔에 접근이 가능
Operator
- Publisher에게 받은 값을 가공해서 Subscriber에게 제공
- Input, OutPut, Failure 타입을 받는데, 타입이 다를 수 있다.
- 내부 메소드가 매우 많음, (map, filter, reduce, collect, combineLatest...)
Scheduler
- 이는 언제 어떻게 Closure를 실행할지 정해주는 역할을 한다.
- Operator에서 Scheduler를 파라미터로 받을 때가 있음 -> 작업에 백그라운드 혹은 메인 스레드에서 진행이 될 수 있게 도와줌. (얘 자체가 스레드는 x)
2가지 Scheduler 메소드 존재
Subscirbe(on:)
을 이용해서 Publisher가 어느 스레드에서 수행할 지 결정
- 무거운 ㅈ가업은 메인이 아닌, 다른 스레드에서 작업할 수 있게 도와줌.
receive(on:)
을 이용해서 Subscriber, Operator 가 어느 스레드에서 수행할 지 결정
- UI 업데이트 필요한 데이터를 메인 스레드에서 받을 수 있게 도와줌 (e.g 서버에서 가져온 데이터를 UI 업데이트 할 때)