原文链接:[https://www.jianshu.com/p/f61a5a988590], 此文为笔记整理,感谢原作者
1.可观察序列Observable
Observable<T>这个类我们可以称它为可观察序列。它会异步地产生一系列的 Event(事件),即一个Observable<T>对象会随着时间推移不定期地发出 event(element : T)这样一个东西。
事件Event定义如下:
public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
1.1创建Observable方式:
-
just()方法该方法通过传入一个默认值来初始化Observable<Int>.just(5) -
of()该方法可以接受可变数量的参数(必需要是同类型的)Observable.of("A", "B", "C") -
from()该方法需要一个数组参数Observable.from(["A", "B", "C"]) -
empty()该方法创建一个空内容的Observable序列 -
never()该方法创建一个永远不会发出Event(也不会终止)的Observable序列 -
error()该方法创建一个不做任何操作,而是直接发送一个错误的Observable序列。 -
range()该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的Observable序列。 -
repeatElement()该方法创建一个可以无限发出给定元素的Event的Observable序列(永不终止)。
*generate()该方法创建一个只有当提供的所有的判断条件都为true的时候,才会给出动作的Observable序列。 -
create()该方法接受一个block形式的参数,任务是对每一个过来的订阅进行处理。 -
deferred()该个方法相当于是创建一个Observable工厂,通过传入一个block来执行延迟Observable序列创建的行为,而这个block里就是真正的实例化序列对象的地方。
*interval()这个方法创建的Observable序列每隔一段设定的时间,会发出一个索引数的元素。而且它会一直发送下去。 -
timer()这个方法有两种用法,一种是创建的Observable序列在经过设定的一段时间后,产生唯一的一个元素。
1.2订阅Observable
- 使用
subscribe()订阅得到event事件 - 使用
subscribe()方法的onNext、onError、onCompleted和onDisposed进行分类订阅得到解包的数据 - 使用
doOn可以分别对subscribe()的Next、Error、Completed等进行监听
2.观察者Observer
创建方式:
- 在可观察序列的
subscribe方法中创建
observable.subscribe(onNext: { element in
print(element)
})
- 在
bind方法中创建
observable
.map { "当前索引数:\($0 )"}
.bind { [weak self](text) in
//收到发出的索引数后显示到label上
self?.label.text = text
}
.disposed(by: disposeBag)
- 使用
AnyObserver创建观察者
let observer: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
let observable = Observable.of("A", "B", "C")
observable.subscribe(observer)
- 配合
bindTo方法使用
observable
.map { "当前索引数:\($0 )"}
.bind(to: observer)
.disposed(by: disposeBag)
- 使用
Binder创建观察者
Binder主要有以下特征:- 不会处理错误事件
- 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
- 一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息
//观察者
let observer: Binder<String> = Binder(label) { (view, text) in
//收到发出的索引数后显示到label上
view.text = text
}
//Observable序列
observable
.map { "当前索引数:\($0 )"}
.bind(to: observer)
.disposed(by: disposeBag)
练习Demo:包括语法和MVVM https://github.com/3KK3/RxSwiftDemo