iOS Ellen

[RxSwift] BehaviorSubject 실험하기! 본문

iOS/RxSwift

[RxSwift] BehaviorSubject 실험하기!

Ellen61 2022. 7. 5. 14:54

 

BehaviorSubject를 사용할때 프로퍼티에 Behavior<Model>(value: Model())로 사용하면 어떤 일이 생기는지 실험해보자!

 

PublishSubject 사용한 경우

// PublishSubject 예시코드

class ViewModel {
    
    private let modelSubject = PublishSubject<Model>()
    
    private let bag = DisposeBag()
    
    var modelObservable: PublishSubject<Model> {
        return modelSubject
    }
    
    init() {
        bind()
    }
    
    private func bind() {
        input.touchButton
            .subscribe { [weak self] _ in
                guard let self = self else { return }
                self.modelSubject.onNext(Model())
            }.disposed(by: bag)
    }
}

메모리상에 Model이 없다는 것을 확인할 수 있다.

modelSubject가 PublishSubejct가 아니라 BehaviorSubject가 된다면?

 

 

// modelSubject를 BehaviorSubject로 변경

class ViewModel {

    private let modelSubject: BehaviorSubject<Modelable> = BehaviorSubject(value: Model())
    
    private let bag = DisposeBag()
    
    var modelObservable: BehaviorSubject<Model> {
        return modelSubject
    }
    
    init() {
        bind()
    }
    
    private func bind() {
        input.touchButton
            .subscribe { [weak self] _ in
                guard let self = self else { return }
                self.modelSubject.onNext(Model())
            }.disposed(by: bag)
    }
}

Model이 메모리상에 존재한다.

프로퍼티가 Model 인스턴스를 가지고 있으니까 해제되지 않는 것이 당연하다.

 

private lazy var modelSubject: BehaviorRelay<Model> = {
        let relay = BehaviorRelay<Model>(value: Model())
        return relay
    }()

위와 같이 lazy var로 만든 이유는 BehaviorSubject가 빌드타임이 아닌 런타임에 메모리에 할당 될 수 있다.

이렇게 구현하면 조금이라도 앱 퍼포먼스에 도움이 되지 않을까?

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] PublishSubject & BehaviorSubject 이해하기  (0) 2022.06.18