Getting Started with Combine Framework in Swift - Introduction to Functional Reactive Programming
Publisher
부터 Subscriber
까지 이어지는 데이터 스트림을 결합input
형식과 output
형식 존재, 각 모듈은 퍼블리셔부터 섭스크라이버까지 연결되는 일종의 블럭input
, output
, failure
경우 등을 조합한 AnyPublisher
사용 가능Passthroughsubject
Currentvaluesubject
@Published
Just
Future
Notification Publisher
URLSession Publisher
sink
assign(on, to)
assign(on)
import UIKit
import Foundation
import Combine
var cancellables = Set<AnyCancellable>()
var subscription: Cancellable? = Timer.publish(every: 0.1, on: .main, in: .common)
.autoconnect()
.throttle(for: .seconds(1), scheduler: DispatchQueue.main, latest: true)
.scan(0, { count, output in
return count + 1
})
.filter {$0 > 2 && $0 < 100}
.sink { output in
print("Finished stream with \(output)")
} receiveValue: { value in
print("Received value \(value)")
}
RunLoop.main.schedule(after: .init(Date(timeIntervalSinceNow: 5))) {
print("Cancel Subscription")
// subscription.cancel()
subscription = nil
}
Timer
퍼블리셔를 사용한 Combine
예제throttle
을 통해 타이머가 0.1초마다 오더라도 1초 단위로 걸러주기scan
을 통해 들어오는 데이터의 개수 카운팅filter
를 통해 값 필터링 가능sink
를 통해 들어오는 데이터를 사용, UI 패치 등에 사용하기publish
로 발행된 데이터 스트림이 sink
단위로 이어질 때 개발자의 사용 목적에 따라 map
, flatMap
등 다양한 고차 함수 사용 가능receive
를 통해 어떤 스레드에서 받을 것인지 결정할 수 있음cancel
, nil
로 주기 등 구독 취소 가능