-
RxSwift - Observable factoryProgramming/RxSwift 2022. 3. 21. 18:31
안녕하세요 BeePeach입니다 :)
오늘은 Observable factory에 대해서 공부해보도록 하겠습니다.
사실 이 부분은 이후에 포스팅할 Operator부분에서 다뤄도 되는 부분인데 먼저 다뤄보도록 하겠습니다.
Observable factory 란 Observable에서 제공하는 deferred 오퍼레이터를 이용해서 조건에 따라 구독자마다 새로운 Observable을 생성하는 것을 말합니다.
Factory 즉, 공장이라는 것을 떠올려보면 Observable을 찍어내는 공장을 생각하면 됩니다.
주의해야하는 것은 조건에 따라 다른 이벤트를 방출하는 게 아니라 다른 Observable을 생성한다는것입니다.
말로만해서는 이해가 안가니까 찬찬히 살펴보도록 하겠습니다.
deffered 오퍼레이터를 살펴보면 클로저 하나를 파라미터로 받고 리턴형이 Observable입니다.
그리고 파라미터로 받는 클로저는 () -> Observable으로 Observable을 리턴해줘야 합니다.
즉 새로운 옵저버가 구독을 할 때마다 새로운 sequence를 리턴해주는 오퍼레이터입니다.
예시를 보도록 하겠습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersimport RxSwift let disposeBag: DisposeBag = DisposeBag() var isOdd: Bool = false let factory: Observable<Int> = Observable.deferred { isOdd.toggle() if isOdd { return Observable.of(1, 3, 5) } else { return Observable.of(2, 4, 6) } } // 외부적으로는 observable factory는 observable과 구별이 가지 않습니다. for _ in 0...3 { factory.subscribe(onNext: { print($0, terminator: " ") }).disposed(by: disposeBag) print() } // 1 3 5 // 2 4 6 // 1 3 5 // 2 4 6 이 코드는 새로운 옵저버가 구독을 할 때마다 isOdd 변수가 변경이 되고 이 변수에 따라서 방출하는 데이터가 달라지는 Observable을 생성합니다.
그래서 factory를 구독하게 되면 evenNumber를 방출하는 Observable이 생성되고 옵저버에게 2, 4, 6을 방출하게 됩니다.
그다음에는 oddNumber를 방출하는 Observable이 생성되고 1, 3 5를 방출하게 됩니다.
이렇게 Observable을 따로따로 만들 수도 있고 deferred 오퍼레이터를 이용해서 상황에 맞춰서 observable을 생성하는 factory를 만들 수 있습니다.
설명한것과 마찬가지로 사용하는 입장에서는 이게 Observable factory인지 Observable인지 중요하지 않습니다.
그냥 이전과 같이 구독해서 사용하며 조건에 맞게 알맞은 Observable이 생성되고 방출을 시작하게 됩니다.
참고자료
RxSwift: Reactive Programming with Swift, Chapter 2: Observables
Now that you’re ready to use RxSwift and have learned some of the basic concepts, it’s time to play around with observables.
www.raywenderlich.com
728x90'Programming > RxSwift' 카테고리의 다른 글
RxSwift - Subject와 Relay (0) 2022.03.25 RxSwift - Trait (0) 2022.03.24 RxSwift - Disposable (0) 2022.03.17 RxSwift - Subscribe (0) 2022.03.17 RxSwift - Observable (0) 2022.03.05