protocol Publisher {
associatedtype Output
associatedtype Failure: Error
}
→ 구체적인 output 및 실패 타입(Failure) 정의 필요
Just
: 값을 다룬다Future
: Function을 다룬다protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
}
→ Input 및 실패 타입(Failure) 정의 필요
assign
: Publisher가 제공한 데이터를 특정 객체의 키패스에 할당sink
: Publisher가 제공한 데이터를 받을 수 있는 closure 제공Cancellable
protocol을 따르고 있다: 특별한 형태의 퍼블리셔
send(_:)
메소드를 이용해 이벤트 값을 주입시킬 수 있는 퍼블리셔PassthroughSubject
CurrentValueSubject
: 얘도 결국엔 퍼블리셔
@Published
로 선언된 프로퍼티를 퍼블리셔로 만들어준다$
를 이용해 퍼블리셔에 접근할 수 있다class Weather {
@Published var temperature: Double
init(temperature: Double) {
self.temperature = temperature
}
}
let weather: Weather = Weather(temperature: 20)
let subscription = weather.$temperature.sink {
print("Temperature now: \($0)")
}
weather.temperature = 25
// Temperature now: 20.0
// Temperature now: 25.0
정의
두 가지 Scheduler 메소드
subscribe(on:)
: publisher가 어느 스레드에서 작업을 수행할지 결정receive(on:)
: operator, subscriber가 어느 스레드에서 작업을 수행할지 결정Pattern
let jsonPublisher = MyJasonLoaderPublisher()
jsonPublisher
.subscribe(on: backgroundQueue)
.receive(on: RunLoop.main)
.sink { value in
label.text = value
}
→ 위 코드를 도식화 하면 아래 이미지처럼 나타낼 수 있다.
⛔️ 할 수는 있지만 컴파인을 사용하는데 굳이 싶은 방법
publisher.sink {
DispatchQueue.main.async {
// update UI
}
}
✅ 컴바인을 사용할 때는 이렇게 하자!
publisher.receive(on: DispatchQueue.main).sink {
// update UI
}