[RxSwift] RxSwift - subscribe, dispose

임주희·2022년 11월 29일
0

RxSwift

목록 보기
2/5

RxSwift에서의 Subscribe, Disposing에 대해 알아보자.

이 둘은 'Observable: 특정 이벤트 발행 → subscribe: 구독 → Disposing: 구독 해제'의 흐름으로 사용된다.

subscribe

Observable.just(1)

// 출력 없음

위의 코드는 구독을 하지 않았기 때문에 어떠한 출력도 없다.

Observable.just(1)
    .subscribe { 	// <-구독
        print($0)
    }
    
// 출력
// next(1)
// completed

subscribe() 사용하여 Observable을 구독하면 Observable이 방출하는 항목을 보거나 Observable에서 오류 또는 완료 알림을 받을 수 있다.


Disposing

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()로 관리하는 것은 효율적이지 않음

disposeBag

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에 넣고 관리하도록 하자.



[출처] reactivex.io
[출처] ReactiveX/RxSwift: Reactive Programming in Swift - GitHub

0개의 댓글