Tunko Development Diary

RxSwift) Scheduler 본문

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 달라진것을 확인할 수 있습니다.

반응형
Comments