rxSwift

[rxSwift] Observable create 하는 법

웰코발 2022. 10. 20. 19:04
  • 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