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") }