protocol Publisher {
associatedtype Output
associatedtype Failure: Error
func subscribe<S: Subscriber>(_ subscriber: S)
where S.Input == Output, S.Failure == Failure
}
Just
, Future
가 있음Just
는 값을 다루고Future
는 Function을 다룸protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Input) -> Sbuscribers.Demand
func receive(completion: subscribers.Completion<Failure>)
}
assign
과 sink
가 있음assign
는 Publihser가 제공한 데이터를 특정 객체의 키패스에 할당sink
는 Publisher가 제공한 데이터를 받을 수 있는 클로져를 제공함Cancellable
protocol을 따르고 있음send(_:)
메소드를 이용해서 이벤트 값을 주입시킬 수 있는 퍼블리셔PassthroughSubject
CurrentValueSubject
@Published
로 선언된 프로퍼티를 퍼블리셔로 만들어줌$
를 이용해서 퍼블리셔에 접근할 수 있음class Weather {
@Published var temperature: Double
init(temperature: Double) {
self.temperature = temperature
}
}
let weather = Weather(temperature: 20)
let subscription = weather.$temperature.sink {
print("Temperature now: \($0)")
}
weather.temperature = 25
// Temperature now: 20.0
// Temperature now: 25.0
subscribe(on:)
을 이용해서, publisher가 어느 스레드에서 수행할지 결정해주는 것
receive(on:)
을 이용해서 operator, subscriber가 어느 스레드에서 수행할 지 결정해주는 것let jsonPublisher = MyJSONLoaderPublisher() //Some publisher.
jsonPublisher
.subscribe(on: backgroundQueue)
.receive(on: RunLoop.main)
.sink { value in
label.text = value
}
🔴이렇게 하지말기
pub.sink {
DispatchQueue.main.async {
// Do update UI
}
}
🟢이렇게 하기
pub.receive(on: DispatchQueue.main).sink {
// Do update ui
}