Development/RxSwift
RxSwift) Scheduler
Tunko
2022. 6. 9. 23:47
scheduler는 cocoa에서의 GCD 사용과 비슷합니다.
옵저버블에서 각 연산자의 동작이나 구독할때 쓰레드를 설정해줄 수 있습니다.
RxSwift에서 Scheduler를 지정하기 위해선 두가지 메소드를 사용할 수 있습니다.
observe(on:) 과 subscribe(on:) 입니다.
observe(on:)은 뒤에 오는 모든 연산자는 전달한 Scheduler에서 코드가 작업합니다.
반면 subscribe(on:)은 옵저버블이 구독되여 어떤 스케쥴에서 작업할지 지정해줍니다. 따라서 구독하는 시점에 반영되는 subscribe(on:)은 어디에서 작성해도 관계 없습니다.
이제 예제 코드와 출력 결과를 확인하겠습니다.
let disposeBag = DisposeBag()
let backgroundScheduler = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())
Observable.just(4)
.filter { taskNumber -> Bool in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> filter")
return taskNumber.isMultiple(of: 2)
}
.observe(on: backgroundScheduler)
.map { taskNumber -> Int in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> map1")
return taskNumber * 2
}
.observe(on: MainScheduler.instance)
.map { taskNumber -> Int in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> map2")
return taskNumber * 3
}
.subscribe {
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> subscribe")
print($0)
}
.disposed(by: disposeBag)
출력
Main Thread >> filter
Background Thread >> map1
Main Thread >> map2
Main Thread >> subscribe
next(24)
Main Thread >> subscribe
completed
출력결과를 확인해보자.
옵저버블에서의 처음 연산자인 filter에서는 Main Thread에서 작업이 진행됩니다.
다음 연산자에서 .observe(on: backgroundScheduler) 통해 백그라운드 작업을 하겠다고 선언해줍니다.
다음에 온 map 연산자를 통한 값변형은 Background Thread 에서 진행됩니다.
또다시 메인에서 작업하기위해서 .observe(on: MainScheduler.instance) 으로 작업 쓰래드를 정해줍니다.
출력된 로그를 확인하면
main → background → main 으로 Thread 달라진것을 확인할 수 있습니다.
반응형