本节示例代码均在 [RxScheduler]
提示:本章不算什么干货,只是对上一节的线程进行一个整理,方便使用时调用,如果强行定义为干货,那就认为本节是实践吧(单纯的不喜欢实战两个字)。
import RxSwift
public enum TScheduler {
case Main
case Serial(DispatchQueueSchedulerQOS)
case Concurrent(DispatchQueueSchedulerQOS)
case Operation(NSOperationQueue)
public func scheduler() -> ImmediateSchedulerType {
switch self {
case .Main:
return MainScheduler.instance
case .Serial(let QOS):
return SerialDispatchQueueScheduler(globalConcurrentQueueQOS: QOS)
case .Concurrent(let QOS):
return ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: QOS)
case .Operation(let queue):
return OperationQueueScheduler(operationQueue: queue)
}
}
}
我比较喜欢上面这个样子,当然你可以不喜欢后面再调用一个 scheduler()
。而且 observeOn
中传入的是一个协议,有时传入的是协议,== 调用时总是麻烦点,如果传入的是一个 enum ,我们就可以直接这样调用 observeOn(.Main)
。
那就再加一个 extension :
extension ObservableType {
@warn_unused_result(message="http://git.io/rxs.uo")
public func observeOn(scheduler: TScheduler) -> RxSwift.Observable<Self.E> {
return observeOn(scheduler.scheduler())
}
}
调用起来就很方便了:
NSURLSession.sharedSession()
.rx_data(request)
.map { UIImage(data: $0) }
.observeOn(.Main) // 切换到主线程
.bindTo(imageView.rx_image) // 在主线程设置 `image`
.addDisposableTo(disposeBag)
下一节:017 第三章 第四节:不要滥用线程
下一节:019 第四章 第一节: RxCocoa 的 API