EEYatHo 앱 깎는 이야기

RxSwift ) 스케쥴러, Subscribe(on:), observe(on:) - EEYatHo iOS 본문

iOS, Swift/Swift Theory

RxSwift ) 스케쥴러, Subscribe(on:), observe(on:) - EEYatHo iOS

EEYatHo 2023. 2. 13. 17:11
반응형

 

RxSwift 의 Scheduling


RxSwift 에서 제공하는 스케쥴러(쓰레드) 관리 API 는 2가지 

  • subscribe(on: Scheduler)  subscribeOn is deprecated and renamed
  • observe(on: Scheduler)  observeOn is deprecated and renamed

 

 

 

subscribe(on:)


  • operator chain 의 어디에서 호출하든 모든 closure 의 Scheduler 설정.
  • 여러개를 호출할 경우, 맨 처음(맨 위)의 subscribe(on:) 만 적용됨.
  • subscribe(on:)이 없으면, create {} 는 관찰하는 곳(subscribe()이 호출된 곳)에서 호출된다.
    여기서 정해진 Scheduler는, observe(on:)이 나오기 전까지 유지된다.
 Observable<[Int]>.create { observer in
    // create closure
    // subscribe 되는 순간 observable 생성 및 클로저 실행
    print(Thread.isMainThread)
    observer.onNext([1,2,3])
    return Disposables.create {}
}
// 이 subscribe(on:)으로, 모든 closure이 메인쓰레드가 아닌 곳에서 실행됨 
.subscribe(on: ConcurrentDispatchQueueScheduler(qos: .background))
// 이 subscribe(on:)은 무시됨.
.subscribe(on: MainScheduler.instance)
.map {
    // map closure
    print(Thread.isMainThread)
}
.subscribe { event in
    // observe closure
    print(Thread.isMainThread)
}
.disposed(by: disposeBag)
// false
// false
// false

 

 

 

observe(on:)


  • 호출한 시점 아래 closure 들의 Scheduler 설정
Observable<[Int]>.create { observer in
    // create closure
    // subscribe 되는 순간 observable 생성 및 클로저 실행
    print(Thread.isMainThread)
    observer.onNext([1,2,3])
    return Disposables.create {}
}
// create closure 의 Scheduler 설정
.subscribe(on: MainScheduler.instance)
// map closure 의 Scheduler 설정
.observe(on: ConcurrentDispatchQueueScheduler(qos: .background))
.map {
    // map closure
    print(Thread.isMainThread)
}
// observe closure 의 Scheduler 설정
.observe(on: MainScheduler.instance)
.subscribe { event in
    // observe closure
    print(Thread.isMainThread)
}
.disposed(by: disposeBag)

 

 

 

이미지를 통한 이해


  • 파란색 subscribe(on:)으로, 처음엔 파란색 스케쥴러 (전체 적용)
  • 주황색 observe(on:)으로, 중간부분은 주황색 스케쥴러
  • 분홍색 observe(on:)으로, 마지막은 분홍색 스케쥴러

 

 

 

Reference


https://levenshtein.tistory.com/471

 

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/GettingStarted.md#creating-your-own-observable-aka-observable-sequence

 

 

Comments