RxSwift에서의 Subscribe, Disposing에 대해 알아보자.
이 둘은 'Observable: 특정 이벤트 발행 → subscribe: 구독 → Disposing: 구독 해제'의 흐름으로 사용된다.
Observable.just(1)
// 출력 없음
위의 코드는 구독을 하지 않았기 때문에 어떠한 출력도 없다.
Observable.just(1)
.subscribe { // <-구독
print($0)
}
// 출력
// next(1)
// completed
subscribe() 사용하여 Observable을 구독하면 Observable이 방출하는 항목을 보거나 Observable에서 오류 또는 완료 알림을 받을 수 있다.
Disposable
사용 후 버리게 되어 있는, 일회용의Dispose
처분하다
물건이나 재산 등을 처리하여 치우다.
시퀀스를 완료하고 다음 요소를 계산하기 위해 할당된 모든 리소스를 해제하려는 경우 구독에서 dispose를 호출할 수 있다.
let scheduler = SerialDispatchQueueScheduler(qos: .default)
// Observable 생성
let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
.subscribe { event in // 구독
print(event)
}
Thread.sleep(forTimeInterval: 2.0)
subscription.dispose() // 구독 해제
// 출력
// 0
// 1
// 2
// 3
// 4
// 5
하지만 각각의 구독에 대해 하나씩 dispose()로 관리하는 것은 효율적이지 않음
let disposeBag: DisposeBag = DisposeBag()
Observable.just(1)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag) //<-
Observable.just(2)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag) //<-
subscribe의 리턴 값(Disposable)을 disposeBag에 추가하고,
disposeBag은 disposable들을 갖고있다가 자신이 할당 해제 할때 모든 구독에 대해 dispose()를 날린다.
dispose()를 까먹을 경우 메모리 누수로 이어질 수 있기 때문에 구독하면 바로 disposeBag에 넣고 관리하도록 하자.