1. RxSwift核心
Observable:产生产生事件(Event)
Observer:负责订阅Observable,响应Observable产生的事件(Event)
Disposable:管理绑定(订阅)的生命周期
2. 什么是序列?
一切事物皆是序列。比如把网络请求的返回的JSON看作是一个序列,然后当取到 JSON 时,将它打印出来;再比如把任务回调看作是一个序列。当任务结束后,提示用户任务已完成。
3. 序列的创建(Observable)
可以使用以下几种方式创建Observable
,observable1
中使用onNext(Event)
发出元素,其他几种方式均为常用的操作符进行的创建
let observable1 = Observable<Int>.create { (observer) -> Disposable in observer.onNext(1) observer.onCompleted() return Disposables.create() } let observable2 = Observable.just(1) let observable3 = Observable.of(1) let observable4 = Observable.from([1]) let observable5 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
4. 序列的订阅(Observer)
方式一:直接创建AnyObserver
进行订阅,监听next(Element)
元素或者error(Swift.Error)
错误事件或者completed
完成事件
let observer: AnyObserver<Int> = AnyObserver { (event) in switch event { case .next(let res): print(res) break case .completed: print("completed") break case .error(let err): print(err is TestError) break } } observable1.subscribe(observer)
方式二:直接调用subscribe
进行订阅
observable1.subscribe { (value) in print(value) } onError: { (err) in print(err is TestError) } onCompleted: { print("completed") } onDisposed: { print("onDisposed") }
方式三:通过Binder
绑定,把Observable
的结果通过map
转换绑定到某个元素上进行订阅,其中label.rx.text
为Binder<String?>
类型
let label = UILabel() observable1.map({ "\($0)" }).bind(to: label.rx.text)
5. 销毁(Disposable)
每当一个Observable
被订阅的时候,这个函数就会返回一个Disposeable
实例,通常来说,一个序列如果发出了error
或者completed
事件,那么所有内部资源都会被释放。如果你需要提前释放这些资源或取消订阅的话,那么你可以手动调用Disposeable
的dispose
方法,调用dispose
方法后,订阅将被取消,并且内部资源都会被释放。通常情况下,你是不需要手动调用dispose
方法的,除非明确知道这个资源我不再使用,这个场景下可以手动调用,取消订阅的几种方式如下:
方式一:直接调用dispose
立即释放资源
observable1.subscribe { (value) in print(value) } onError: { (err) in print(err is TestError) } onCompleted: { print("completed") } onDisposed: { print("onDisposed") }.dispose()
方式二:利用DisposeBag
,当bag
销毁(deinit
)的时候,会自动调用Disposeable
的dispose
方法
observable1.subscribe { (value) in print(value) } onError: { (err) in print(err is TestError) } onCompleted: { print("completed") } onDisposed: { print("onDisposed") }.disposed(by: disposeBag)
方式三:利用take(until: rx.deallocated)
,当前的实例销毁(deinit
)的时候,会自动调用Disposeable
的dispose
方法
let _ = observable1.take(until: rx.deallocated).subscribe { (value) in print(value) } onError: { (err) in print(err is TestError) } onCompleted: { print("completed") } onDisposed: { print("onDisposed") }