[iOS] RxSwift 사용하기(5) - Schedulers

"Let's use RxSwift - Schedulers"

Posted by JacksonJang on April 26, 2024

Scheduler

Scheduler는 특정 코드를 실행할 때 사용할 스레드 또는 큐를 결정하는 역할을 합니다.
RxSwift에서 Scheduler를 사용함으로서 동시성을 쉽게 처리할 수 있습니다.

MainScheduler

메인 쓰레드에서의 실행을 보장합니다.(UI 업데이트 사용에 적절해요)

1
2
3
4
5
6
Observable.just("Hello, RxSwift")
    .observe(on: MainScheduler.instance)
    .subscribe(onNext: { value in
        print("MainScheduler : ", value)
    })
    .disposed(by: disposeBag)

ConcurrentDispatchQueueScheduler

동시성 실행을 허용합니다.
즉, 병렬로 여러 작업들을 동시에 처리할 수 있습니다.

1
2
3
4
5
6
7
Observable.from([1, 2, 3, 4, 5])
    .observe(on: ConcurrentDispatchQueueScheduler(qos: .background))
    .map { $0 * 2 }
    .subscribe(onNext: { value in
        print("ConcurrentDispatchQueueScheduler : ", value)
    })
    .disposed(by: disposeBag)

SerialDispatchQueueScheduler

백그라운드에서 순서대로 직렬로 실행하도록 설계되어 있습니다.
즉, 병렬이 아닌 직렬이기 때문에 하나의 작업이 완료될 때까지 다음 작업이 시작되지 않으므로 작업 순서가 중요할 때 사용됩니다.

SerialDispatchQueueScheduler백그라운드 쓰레드이기 때문에 메인 쓰레드와 같이 사용해도 상관 없습니다.

1
2
3
4
5
6
Observable.of("Task 1", "Task 2", "Task 3")
    .observe(on: SerialDispatchQueueScheduler(qos: .default))
    .subscribe(onNext: { value in
        print("SerialDispatchQueueScheduler : ", value)
    })
    .disposed(by: disposeBag)

OperationQueueScheduler

NSOperationQueue 기반으로 작업을 스케줄링합니다. OperationQueue 기반으로 작업을 스케줄링합니다.

OperationQueue는 작업을 큐에 추가하고 우선순위를 설정하며 병렬 또는 직렬로 실행할 수 있게 하는 API입니다.

1
2
3
4
5
6
7
8
let operationQueue = OperationQueue()

Observable.of("Operation 1", "Operation 2", "Operation 3")
    .observe(on: OperationQueueScheduler(operationQueue: operationQueue))
    .subscribe(onNext: { value in
        print("OperationQueueScheduler : ", value)
    })
    .disposed(by: disposeBag)

참고링크

github 예제

https://github.com/JacksonJang/RxSwiftScheduler