除了 Observable,RxSwift 还为我们提供了一些特征序列(Traits):Single、Completable、Maybe、Driver、ControlEvent。 我们可以将这些 Traits 看作是 Observable 的另外一个版本。它们之间的区别是: Observable 是能够用于任何上下文环境的通用序列。 而 Traits 可以帮助我们更准确的描述序列。同时它们还为我们提供上下文含义、语法糖,让我们能够用更加优雅的方式书写代码
- Single Single 是 Observable 的另外一个版本。但它不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件。
发出一个元素,或一个 error 事件 不会共享状态变化
- SingleEvent 为方便使用,RxSwift 还为 Single 订阅提供了一个枚举(SingleEvent)
.success:里面包含该 Single 的一个元素值 .error:用于包含错误
public enum SingleEvent<Element> {
case success(Element)
case error(Swift.Error)
}
-
asSingle() 我们可以通过调用 Observable 序列的 .asSingle() 方法,将它转换为 Single。
-
Completable Completable 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能产生一个 completed 事件,要么产生一个 error 事件。
不会发出任何元素 只会发出一个 completed 事件或者一个 error 事件 不会共享状态变化
- CompletableEvent 为方便使用,RxSwift 为 Completable 订阅提供了一个枚举(CompletableEvent):
.completed:用于产生完成事件 .error:用于产生一个错误
public enum CompletableEvent {
case error(Swift.Error)
case completed
}
- Maybe Maybe 同样是 Observable 的另外一个版本。它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件
发出一个元素、或者一个 completed 事件、或者一个 error 事件 不会共享状态变化
- MaybeEvent 为方便使用,RxSwift 为 Maybe 订阅提供了一个枚举(MaybeEvent)
.success:里包含该 Maybe 的一个元素值 .completed:用于产生完成事件 .error:用于产生一个错误
public enum MaybeEvent<Element> {
case success(Element)
case error(Swift.Error)
case completed
}
-
asMaybe() 我们可以通过调用 Observable 序列的 .asMaybe() 方法,将它转换为 Maybe。
-
Driver (1)Driver 可以说是最复杂的 trait,它的目标是提供一种简便的方式在 UI 层编写响应式代码。 (2)如果我们的序列满足如下特征,就可以使用它:
不会产生 error 事件 一定在主线程监听(MainScheduler) 共享状态变化(shareReplayLatestWhileConnected)
为什么要使用 Driver? (1)Driver 最常使用的场景应该就是需要用序列来驱动应用程序的情况了,比如: 通过 CoreData 模型驱动 UI 使用一个 UI 元素值(绑定)来驱动另一个 UI 元素值 (2)与普通的操作系统驱动程序一样,如果出现序列错误,应用程序将停止响应用户输入。 (3)在主线程上观察到这些元素也是极其重要的,因为 UI 元素和应用程序逻辑通常不是线程安全的。 (4)此外,使用构建 Driver 的可观察的序列,它是共享状态变化
- ControlProperty (1)ControlProperty 是专门用来描述 UI 控件属性,拥有该类型的属性都是被观察者(Observable)。 (2)ControlProperty 具有以下特征:
不会产生 error 事件 一定在 MainScheduler 订阅(主线程订阅) 一定在 MainScheduler 监听(主线程监听) 共享状态变化
- ControlEvent 1)ControlEvent 是专门用于描述 UI 所产生的事件,拥有该类型的属性都是被观察者(Observable)。 (2)ControlEvent 和 ControlProperty 一样,都具有以下特征:
不会产生 error 事件 一定在 MainScheduler 订阅(主线程订阅) 一定在 MainScheduler 监听(主线程监听) 共享状态变化
import RxSwift
import UIKit
extension Reactive where Base: UIButton {
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
}
- Schedulers 调度器(Schedulers)是 RxSwift 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。
(2)RxSwift 内置了如下几种 Scheduler:
CurrentThreadScheduler:表示当前线程 Scheduler。(默认使用这个) MainScheduler:表示主线程。如果我们需要执行一些和 UI 相关的任务,就需要切换到该 Scheduler 运行。 SerialDispatchQueueScheduler:封装了 GCD 的串行队列。如果我们需要执行一些串行任务,可以切换到这个 Scheduler 运行。 ConcurrentDispatchQueueScheduler:封装了 GCD 的并行队列。如果我们需要执行一些并发任务,可以切换到这个 Scheduler 运行。 OperationQueueScheduler:封装了 NSOperationQueue。
- subscribeOn() 该方法决定数据序列的构建函数在哪个 Scheduler 上运行
- observeOn() 该方法决定在哪个 Scheduler 上监听这个数据序列。