티스토리 뷰

🍏/RxSwift

[RxSwift] Observable의 공유

eungding 2019. 4. 4. 12:46
반응형

1. Observable의 라이프사이클

Observable.just(1).debug("just").subscribe().dispose()

2019-04-04 12:14:44.633: just -> subscribed

2019-04-04 12:14:44.703: just -> Event next(1)

2019-04-04 12:14:44.710: just -> Event completed

2019-04-04 12:14:44.710: just -> isDisposed

 

 

2. Observable의 공유

 

- 옵저버블을 공유하지 않으면 subscribe 횟수 만큼 이벤트가 발생한다
- API Call을 하는 Observable을 두번 subscribe하면 API Call이 두번 일어난다 

 

2.1 Observable을 공유하지 않았을 때 

       let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance).take(2).map { (element) -> Int in
            print("map : \(element)")
            return element
        }
        
        observable.subscribe(onNext: { (element) in
            print("observable subscribe1 : \(element)")
        }).disposed(by: disposeBag)
        
        observable.subscribe(onNext: { (element) in
            print("observable subscribe2 : \(element)")
        }).disposed(by: disposeBag)

 

map : 0

observable subscribe1 : 0

map : 0

observable subscribe2 : 0

map : 1

observable subscribe1 : 1

map : 1

observable subscribe2 : 1


=> map이 observable마다 2개씩 출력되는 것을 보니 observable이 공유되지 않고 있음!!

 

 

2.2 ConnectableObservable 

extension ObservableType {

    /**
    Returns a connectable observable sequence that shares a single subscription to the underlying sequence.

    This operator is a specialization of `multicast` using a `PublishSubject`.

    - seealso: [publish operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)

    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
    */
    public func publish() -> ConnectableObservable<E> {
        return self.multicast { PublishSubject() }
    }
}

 

이 publish 메소드를 사용해서 ConnectableObservable을 만들 수 있다 

 

        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance).take(2).map { (element) -> Int in
            print("map : \(element)")
            return element
        }
        
        let connectableObservable: ConnectableObservable<Int> = observable.publish()
        
        connectableObservable.subscribe(onNext: { (element) in
            print("connectableObservable subscribe1 : \(element)")
        }).disposed(by: disposeBag)
        
        connectableObservable.subscribe(onNext: { (element) in
            print("connectableObservable subscribe2 : \(element)")
        }).disposed(by: disposeBag)
        
        // connect해줘야지 시퀀스가 시작됨--!
        connectableObservable.connect().disposed(by: disposeBag)

 

map : 0

connectableObservable subscribe1 : 0

connectableObservable subscribe2 : 0

map : 1

connectableObservable subscribe1 : 1

connectableObservable subscribe2 : 1

 

=>  observable이 공유되고 있음!! 

 

 

+ 공유에 대하여 더 많은 정보를 담고 있는 블로그 : https://brunch.co.kr/@tilltue/15 

 

RxSwift, subscriptions 의 공유

multicast, connect, replay, publish | * 이 포스트는 RxSwift 4.3.1, swift 4.2 버전을 기준으로 작성되었습니다. Cold Observable 은 subscribe 시점부터 Observable 이 이벤트를 발생시키기 시작한다. 두번의 subscribe 가 일어나면 두개의 이벤트 스트림이 발생한다는 것이다. 하나의 이벤트 스트림을 두개의 subscribe에서 공유하고 싶다면 어

brunch.co.kr

 

반응형
댓글