原文链接:[//www.greatytc.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