Scheduler
幾種內嵌Scheduler(Builtin schedulers)
CurrentThreadScheduler (Serial scheduler)
當前線程的調度者,這也是默認的調度者用於產生元素。
MainScheduler (Serial scheduler)
public final class MainScheduler : SerialDispatchQueueScheduler {
private let _mainQueue: DispatchQueue
/// Initializes new instance of `MainScheduler`.
public init() {
_mainQueue = DispatchQueue.main
super.init(serialQueue: _mainQueue)
}
/// Singleton instance of `MainScheduler`
public static let instance = MainScheduler()
}
SerialDispatchQueueScheduler (Serial scheduler)
ConcurrentDispatchQueueScheduler (Concurrent scheduler)
OperationQueueScheduler (Concurrent scheduler)
TestScheduler
注意:有趣的事情是如果傳遞併發列隊(concurrent queue)到串行調度者(serial scheduler),RxSwift將確保併發列隊變成串行列隊(serial queue)。同理:如果傳遞串行列隊到併發調度者,也會將串行列隊變成併發列隊(concurrent queue)
extension ObservableType {
/**
Wraps the source sequence in order to run its observer callbacks on the specified scheduler.
This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription
actions have side-effects that require to be run on a scheduler, use `subscribeOn`.
- seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)
- parameter scheduler: Scheduler to notify observers on.
- returns: The source sequence whose observations happen on the specified scheduler.
*/
public func observeOn(_ scheduler: ImmediateSchedulerType) -> RxSwift.Observable<Self.E>
}
調用 observeOn 指定接下來的操作在哪個線程,也可以理解爲在哪個scheduler監聽Observable.一個比較典型的例子:在後臺發起網絡請求,然後解析數據,最後在主線程刷新頁面。我們可以先使用subscribeOn切換到後臺發送請求並解析數據,在使用observeOn切換回到主線程更新頁面。或者使用兩次observeOn
sequence1
.observeOn(backgroundScheduler)
.map { n in
print("This is performed on the background scheduler")
}
.observeOn(MainScheduler.instance)
.map { n in
print("This is performed on the main scheduler")
}
extension ObservableType {
/**
Wraps the source sequence in order to run its subscription and unsubscription logic on the specified
scheduler.
This operation is not commonly used.
This only performs the side-effects of subscription and unsubscription on the specified scheduler.
In order to invoke observer callbacks on a `scheduler`, use `observeOn`.
- seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)
- parameter scheduler: Scheduler to perform subscription and unsubscription actions on.
- returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.
*/
public func subscribeOn(_ scheduler: ImmediateSchedulerType) -> RxSwift.Observable<Self.E>
}
當然,如果我們沒有明確調用這兩個操作,後面的操作都是在當前線程執行的。對於調度者使用的簡單事例可以看這裏。