이번 포스트에서는 외부 조건에 따라 다른 Observable을 제공해 주는 deferred연산자에 대해 알아보겠습니다.
deferred 연산자의 선언부는 다음과 같습니다.
public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>)
deferred 연산자는 Observable을 만들어내는 팩토리 클로저를 인자로 받습니다. 그리고 실제 구독이 일어나는 시점에서야 실제 Observable을 만들어냅니다. 즉, 실제 Observable이 만들어지는 시점이 미루어진다고 해서 ‘deferred’ 입니다.
var observableSwitch:Bool = false
let observable = Observable<Int>.deferred {
observableSwitch.toggle()
if observableSwitch {
return Observable.from([1,2,3])
} else {
return Observable.from([4,5,6])
}
}
observable.subscribe { event in
switch event {
case let .next(value):
print(value)
default:
print("finished")
}
}.disposed(by: bag)
// 1
// 2
// 3
// finished
observable.subscribe { event in
switch event {
case let .next(value):
print(value)
default:
print("finished")
}
}.disposed(by: bag)
// 4
// 5
// 6
// finished
이런식으로 deferred 연산자를 통해 상태에 따라 다른 데이터를 처리해야할 필요가 있을 경우를 대처할 수 있습니다.