- create
- Obseravble을 커스터마이징 하게 만드는 방법임.
- create는 escaping 클로저로, escaping에서는 AnyObserver를 취한 뒤 Disposable을 리턴한다.
- 여기서 AnyObserver란 generic 타입으로 Observable sequence에 값을 쉽게 추가할 수 있다.
var disposeBag = DisposeBag()
Observable.create { observer -> Disposable in
observer.onNext(1)
observer.on(.next(6))
observer.onCompleted()
onberver.onNext(9)
return Disposables.create()
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// 1
// 6
// completed
enum MyError: Error {
case anError
}
Observable.create { observer -> Disposable in
observer.onNext(1)
observer.onError(MyError.anError)
observer.onCompleted()
observer.onNext(2)
return Disposables.create()
}
.subscribe (
onNext: {
print($0)
},
onError: {
print($0.localizedDescription)
},
onCompleted: {
print("completed")
},
onDisposed: {
print("disposed")
}
)
// 1
// anError
// disposed
- deferred
- deferred 연산자는 Observable을 만들어내는 팩토리 클로저를 인자로 받음.
- 실제 구독이 일어나는 시점에서야 실제 Observable을 만듦.
- 즉, 실제 Observable이 만들어지는 시점이 미루어진다고 해서 ‘deferred’ 임.
var observableSwitch:Bool = false
// 대기 중이다가 subscribe한 시점에 Observable을 return 함
let observable = Observable<Int>.deferred {
observableSwitch.toggle()
if observableSwitch {
// 실제 Observable이 여기서 만들어짐
return Observable.from([1,2,3])
} else {
// 실제 Observable이 여기서 만들어짐
return Observable.from([4,5,6])
}
}
// observableSwitch 가 true
observable.subscribe { event in
switch event {
case let .next(value):
print(value)
default:
print("finished")
}
}.disposed(by: bag)
// 1
// 2
// 3
// finished
// observableSwitch 가 false
observable.subscribe { event in
switch event {
case let .next(value):
print(value)
default:
print("finished")
}
}.disposed(by: bag)
// 4
// 5
// 6
// finished