RxSwift - Scheduler
Scheduler
スケジューラとは?
簡単に言えばThreadです.
メインスレッドに加え,バックグラウンドでネットワークタスクなどを非同期で処理したい場合は,マルチスレッドで分岐処理を行うことができる.
SchedulerのdefaultはMainThreadです.
Operator
スケジューラを使用するオペレータは2種類あります.
observe(on:)
パラメータとして指定されたスケジューラを受け入れます.
observe(on:)はスケジューラを変更できます.
「観察」(on:)によって、オペレータの実行時に作成されるThreadの観測可能性を指定します.
Observable.just(“800x600”)
.observeOn(ConcurrentDispatchQueueScheduler(qos: .default))
.map { $0.replacingOccurreces(of: “X”, with “ / ”) }
.map { “https://picsum.photos/\($0)/?random” }
.map { URL(string: $0) }
.filter { $0 != nil }
.map { $0! }
.map { try Data(contentsOf: $0) }
.map { UIImage(data: $0) }
.observeOn(MainScheduler.instance) // MainThread로 분기처리
.subscribe(onNext: { image in
self.imageView.image = image
})
.disposed(by: disposeBag)
}
サンプルコードが上に表示されている場合、observe(on:)は、その演算子が表示される下でobservableが使用するThreadに影響します.したがって、観測可能なオペレータチェーンの異なる場所で「観測」(on:)を複数回呼び出して、特定のオペレータが動作するThreadを変更できます.subscribe(on:)
subscribe(on:)はobserve(on:)と似ているが,異なる性質を有する.
呼び出しポイントが
ex)BackgroundからMainThreadに変更
しかし、subscribeではこれらの機能を実行できません.
_ = Observable.create() { observer in
print(Thread.inMainThread)
return Diposables.create()
}
.subscribe(on : ConcurrentDispatchQueueScheduler(qos : .background ) )
.map { _ in
print(Thread.isMainThread)
}
.subscribe(on : MainScheduler.instance)
.subscribe { event in
print(Thread.isMainThread)
}
.disposed(by : disposBag)
//false
//false
//false
スケジューラのタイプMainScheduler - serial
CurrentThreadScheduler
現在のスレッドを使用します.
SeriaDispatchQueueScheduler
DispatchQueueのシリアルQueueを使用します.
バックグラウンドから抽出されたタスクの処理に使用します(Firebaseを使用するとサーバのエンドポイントに圧力がかかりすぎる場合があります).
ConcurrentDispatchQueueScheduler
バックグラウンドでDispatchQueueのConcurrentQueueを使用します.
シリアルDispatchQueueSchedulerなどの抽出タスクの処理に使用されますが、パラレル
(仕事量の多い仕事に使う)
OperationQueue
NSOperationQueueを使用して複雑な作業を行う場合に使用します.バックグラウンドで実行します.
Reference
この問題について(RxSwift - Scheduler), 我々は、より多くの情報をここで見つけました https://velog.io/@leejinseong9410/RxSwift-Schedulerテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol