Signal과 Drive는 모두 Observable 소속이다.
다만 단독으로 사용되기 보다는 Relay와 Subject를 Observable로 형변환하는 과정에서 더 주로 쓰인다.
두녀석의 공통점은 모두 subscribe 후 main thread 실행을 보장해준다.
struct Output {
var AAASignal : Signal<Bool>
}
private var AAARelay = BehaviorRelay<Bool>(value: false)
AAARelay.asSignal()
형식으로 Relay를 구독하는 형태로 사용할 수 있다.
MVVM에서는 ViewModel의 데이터를 Relay로 관리하다 Signal이나 Driver로 구독한다.
output.AAARelay.emit(onNext: { [weak self] value in
print ("===== ViewController AAARelay emit : \(value)")
self?.btnIDSave.isSelected = value
})
구독은 emit() 함수로 한다.
struct Output {
var AAADriver : Driver<Bool>
}
private var AAARelay = BehaviorRelay<Bool>(value: false)
AAARelay.asDriver()
사용방식은 Signal과 거의 동일하다.
output.AAARelay.drive(onNext: { [weak self] value in
print ("===== ViewController AAARelay drive : \(value)")
self?.btnIDSave.isSelected = value
})
구독은 drive() 함수로 한다.
두 녀석의 가장 큰 차이는 구독 시에 발행되는 값의 차이다.
Driver는 구독 즉시 최신값을 발행한다.
Signal은 구독 이후에 값들만을 감시하여 발행한다.