RxSwift) Scheduler

Havi·2021년 3월 24일
1

RxSwift 기초

목록 보기
10/14

공식 깃헙

참고 블로그1
참고 블로그2
참고 블로그3
참고 블로그4
StackOverflow

Scheduler 란?

Scheduler란 특정 코드가 실행되는 Context(작업의 메커니즘)를 추상화한 것이다.

Cocoa에서는 Main Queue를 사용하지만 RxSwift에서는 MainScheduler를 사용한다.

ObserveOn / SubscribeOn

SunscribeOn은 시퀀스가 시작할 스케줄러를 결정한다. 즉 특정 스케줄러에서 동작의 수행을 보장할 때 한번만 실행하는 것을 권장한다.

ObserveOn은 시퀀스를 어느 스케줄러에서 observe할 것인지를 결정한다. 각각의 Operator(map, filter 등등)을 다른 스케줄러에서 지정하고 싶을 때 사용할 수 있다.

        Observable<Int>.of(1,2,3,4,5)
            .subscribe(on: CurrentThreadScheduler.instance)
            // subscribeOn은 deprecated되었다.
//            .subscribeOn(MainScheduler.asyncInstance)
            .observe(on: MainScheduler.instance)
            .map { 
                print("main 에서 실행 됨")
                print($0)
            }
            .observe(on: ConcurrentDispatchQueueScheduler.init(qos: .background))
            .subscribe({
                print("Concurrent background에서 실행됨")
                print($0)
            })
            .disposed(by: disposeBag)

Scheduler의 종류

1. MainScheduler (Serial scheduler)

MainThread에서 실행되어야 할 작업에서 사용 (주로 UI)

MainSchedule.instance vs MainSchedule.asyncInstance

보이는 그대로 MainSchedule.instance는 synchronous하게, MainSchedule.asyncInstance는 asynchronous하게 main thread에 이벤트를 전달한다.

MainSchedule.asyncInstance는 자주 쓰이지 않고, 가능하면 쓰는걸 회피하는 것이 좋다.
하지만 하나의 event가 같은 pipeline안에서 다른 event를 트리거 할 때 first event가 끝나기 전에 second event가 불린다고 warning이 뜨므로 이런 경우에 사용하면 된다.

2. CurrentThreadScheduler (Serial scheduler)

현재 있는 쓰레드에서 작업이 실행된다.

만약 CurrentThreadScheduler.instance.schedule(state) { }를 어떤 스레드에서 처음으로 호출했다면, 그 예정된 행동은 즉시 실행될 것이고 모든 재귀적 예정된 액션들이 임시로 저장되는 숨겨진 큐가 생성될 것입니다.

만약 콜 스택의 몇몇 부모 프레임이 이미 CurrentThreadScheduler.instance.schedule(state) { }를 실행중이라면, 예정된 액션은 저장되고 현재 실행중인 액션과 모든 전에 저장되었던 액션이 실행 종료되고 나서 실행될 것입니다.

3. SerialDispatchQueueScheduler (Serial scheduler)

특정한 dispatch_queue_t에서 실행되어야 할 작업을 처리한다.

메인 스케줄러는 SerialDispatchQueueScheduler의 인스턴스 중 하나

4. ConcurrentDispatchQueueScheduler (Concurrent scheduler)

특정한 dispatch_queue_t에서 실행되어야 할 작업을 처리한다.

Serial Queue에 작업을 보내도 문제가 생기지 않는다.

보통 백그라운드에서 처리해야 할 때 적합하다.

5. OperationQueueScheduler (Concurrent scheduler)

NSOperationQueue에서 실행되어야 할 작업을 처리한다.

백그라운드에서 작업을 조정하고 싶을 때 사용하며 maxConcurrentOperationCount로 작업 조정 가능

6. TestScheduler

RxTest에 포함되어 있으며 production code에는 사용하지 않음

Custom Scheduler

는 만들 일이 거의 없다고 생각해서 공홈꺼 긁어옴

profile
iOS Developer

0개의 댓글