RxSwift의 Relay나 Trait들을 공부하다보니, Scheduler에 관련된 언급이 많더라구요...?
그래서 이번엔 Scheduler에 대해 공부해봤습니다!
Scheduler란
Scheduler는 프로세스가 작동하는 context를 추상화한 것입니다. 즉, Cocoa의 GCD와 비슷한 개념이라고 생각하시면 됩니다.
아래는 Scheduler 중 하나인 MainScheduler의 구현 코드입니다.
public final class MainScheduler : SerialDispatchQueueScheduler {
private let mainQueue: DispatchQueue
let numberEnqueued = AtomicInt(0)
/// Initializes new instance of `MainScheduler`.
public init() {
self.mainQueue = DispatchQueue.main
super.init(serialQueue: self.mainQueue)
}
실제로 MainSchedule의 내부 프로퍼티인 mainQueue에 GCD의 일종인 DispatchQueue가 사용되고 있음을 알 수 있습니다!
Scheduler의 필요성
Observable의 Operator 체인에 멀티스레딩을 적용하고 싶을 경우, 특정 Scheduler를 사용하면 됩니다. Rx의 특정 Operator는 사용할 Scheduler를 파라미터로 전달 받기도 하는데, 이 Operator들은 자신이 처리할 연산의 일부 또는 전체를 전달된 Scheduler 내부에서 처리합니다.
Observable과 Operator의 체인은 모두 Scheduler를 기반으로 동작하고 일반적으로는 Subscribe 메서드가 호출되는 스레드를 사용해 Observer에게 데이터 시퀀스를 전달합니다. 하지만 SubscribeOn
Operator를 사용하면 데이터시퀀스가 처음 전달되는 스레드를 바꿀 수 있습니다. SubscribeOn
Operator는 다른 Scheduler를 지정해서 Observable이 해당 Scheduler를 통해 시퀀스를 전달하도록 합니다. 그리고 ObserveOn
Operator는 Observer가 해당 시퀀스를 어떤 Scheduler에서 받아올지 결정합니다. 아래 그림을 보면 이해하기가 좀 더 쉽습니다.
SubscribeOn
Operator는 Operator 체인 중 언제 호출해도 문제되지 않습니다. 하지만 ObserveOn
Operator는 Operator 체인 중 Observable이 사용할 스레드가 호출 체인 중 언제 할당되는지에 따라 그 이후의 Operator가 영향을 받습니다. (cf. 추가로 Dispose과정 또한 SubscribeOn
으로 지정된 Scheduler에서 수행됩니다.)
정리해보겠습니다.
- Scheduler를 사용하는 Operator는 앞서 언급한
SubscribeOn
과ObserveOn
이 있습니다. SubscribeOn
은 시퀀스를 어느 Scheduler에서 방출할 것인지를 결정합니다. 즉, 시퀀스의 시작점이 될 Scheduler를 결정할 수 있습니다.ObserveOn
은 시퀀스를 어느 Scheduler에서 observe할 것인지를 결정합니다. 각각의 Operator 동작을 다른 스케줄러에서 처리하고 싶을 때 사용할 수 있습니다.
Scheduler의 종류
- MainScheduler : MainThread에서 수행해야하는 작업을 추상화합니다. 일반적으로 UI 작업을 수행할 때 사용됩니다. MainSchedule.instance는 synchronous하게, MainSchedule.asyncInstance는 asynchronous하게 이벤트가 전달됩니다.
- CurrentThreadScheduler : 현재 thread에서 작업을 수행하도록 합니다. 이는 가장 기본적인(default) Schedular입니다.
- SerialDispatchQueueScheduler : 특정 dispatchQueue에서 수행해야하는 작업을 추상화합니다. Serial하게 작업을 처리합니다. (사실 MainScheduler도 SerialDispatchQueueScheduler의 일종입니다.)
- ConcurrentDispatchQueueScheduler : 특정 dispatchQueue에서 수행해야하는 작업을 추상화합니다. Concurrent하게 작업을 처리합니다.
- OperationQueueScheduler : 특정 NSOperationQueue에서 수행해야하는 작업을 추상화합니다. maxConcurrentOperationCount를 통해 작업양을 조절할수 있습니다.
이 외에도 RxTest에 포함되는 TestScheduler나 직접 생성이 가능한 Custom Scheduler라는 개념도 존재하지만 활용도가 적기 때문에 첨부하지 않았습니다.
참고
'🍎 Apple > Combine & Rx' 카테고리의 다른 글
[RxSwift] ControlProperty, ControlEvent (0) | 2022.02.24 |
---|---|
[RxSwift] Trait (Single, Completable, Maybe) (2) | 2022.02.24 |
[RxSwift] Subject (0) | 2022.02.16 |
[RxSwift] Observable & Operator (0) | 2022.02.14 |
[Combine] share, multicast (0) | 2022.01.13 |