본문 바로가기

Swift/RxSwift

RxSwift - 초기 값을 가지고 있는 BehaviorSubject

BehaviorSubject는 PublishSubject와 달리 초기 생성 시 


값(이벤트)를 가지고 생성되는 Subject입니다.





사진과 같이 보라색의 값을 미리 저장해 뒀다가


subscribe()가 실행되면 미리 저장해둔 값의 이벤트를 실행 시킵니다.





PublishSubject와 코드를 비교해 봅시다.



PublishSubject

/// Creates a subject.
    public override init() {
        super.init()
    }


BehaviorSubject

public init(value: Element) {
        _value = value
    }


생성자를 보았을 때 


값을 받아 놓는 것을 볼 수 있습니다.




다음 코드를 봅시다.



PublishSubject

public override func subscribe(_ observer: O) -> Disposable where O.E == Element {
        _lock.lock()
        let subscription = _synchronized_subscribe(observer)
        _lock.unlock()
        return subscription
    }

    func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E {
        if let stoppedEvent = _stoppedEvent {
            observer.on(stoppedEvent)
            return Disposables.create()
        }
        
        if _isDisposed {
            observer.on(.error(RxError.disposed(object: self)))
            return Disposables.create()
        }
        
        let key = _observers.insert(observer.on)
        return SubscriptionDisposable(owner: self, key: key)
    }


BehaviorSubject

public override func subscribe(_ observer: O) -> Disposable where O.E == Element {
        _lock.lock()
        let subscription = _synchronized_subscribe(observer)
        _lock.unlock()
        return subscription
    }

    func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E {
        if _isDisposed {
            observer.on(.error(RxError.disposed(object: self)))
            return Disposables.create()
        }
        
        if let stoppedEvent = _stoppedEvent {
            observer.on(stoppedEvent)
            return Disposables.create()
        }
        
        let key = _observers.insert(observer.on)
        observer.on(.next(_value))
    
        return SubscriptionDisposable(owner: self, key: key)
    }



여기서 중요한 곳은 return시키기 바로 전입니다.


PublishSubject는 key를 생성시키고 바로 넘기는 반면에


BehaviorSubject는 .next를 value로 실행시키고 넘깁니다.




이러면 맨위의 사진처럼 Subscribe가 실행되는 부분과 일치하게 됩니다.





현재 RxSwift를 공부 중입니다.
틀린 내용이 있다면 지적해주시면 감사하겠습니다.