RxSwift封装蓝牙库

2017-03-29  本文已影响324人  康富贵

为什么要用Rx

传统的编程方式大多都是告诉程序需要做什么、怎么做、什么时候做,并通过KVO、Notification、Delegate监听变化,同时又需要告诉系统什么时候会发生变化。ReactiveX可以帮助我们让代码自动相应更新,程序可以对底层数据的变化做出响应。

RxSwift是ReactiveX的Swift版,RxCocoa使用RxSwift对Cocoa APIs响应式编程的封装。

比如让一个Button响应单击事件,非响应式编程是这样:

button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

func buttonAction() {
    ...
}

用了RxCocoa后变成这样:

button.rx.tap.subscribe(onNext: {
    ...
})

代码变得更加简洁,不需要定义多余的函数,从而可以让开发者更专注于业务逻辑,不再维护中间状态。

Rx的一些重点

Observables和Observers

两个重要的概念:ObservableObserver

多个Observer可以监听同一个Observable,Observable发生变化时会通知所有订阅的Observer。

Observable也相当于事件管道,会向订阅者发送事件信息。事件分为三种:

例如一个网络请求,收到服务端返回的数据后会发送.Next,因为请求都是一次性的,所以Next发送完后会马上发送Completed。如果请求超时了则会发送Error。

DisposeBag

DisposeBag是RxSwift提供的用来管理内存的工具。

当带有DisposeBag属性的对象调用deinit()时,bag将被清空,且每一个Observer会自动取消订阅它所观察的对象。理念类似于autoreleasepool。

如果没有DisposeBag,则会产生retain cycle,或者被意外释放掉,导致程序Crash。

let _disposeBag = DisposeBag()

Observable.just("123").subscribe(onNext: { (item) in

}).addDisposableTo(_disposeBag)

Disposables.create

每个Observable都要求Disposable类型的返回值,通过Disposables.create便能创建Disposable的实例,当Observable被释放时会执行Disposable,相当于析构函数。

Observable.create

实际开发中用的最多的函数,创建一个Observable。

Observable.create { (observer) -> Disposable in
    ...
    if (error) {
        observer.on(.error(RxSwiftError.unknown))
    } else {
        observer.on(.next(value))
        observer.on(.completed)
    }
    return Disposables.create {

    }
}

Observable.just

just只会发送一条数据,它先发送一次.Next(value),然后发送.Completed。

Observable.empty

empty是空管道,它只会发送.Completed消息。

Observable.deferred

deferred会等到有Observer的时候再去创建Observable,相当于懒加载,而且每个订阅者订阅的对象都是内容相同但指针不同的Observable。

Subjects

Subjet是observable和Observer之间的桥梁,它既是Obserable又是Observer,既可以发出事件,也可以订阅事件。

PublishSubject只能收到订阅它之后的事件,订阅之前的事件无法收到。

Debug

打印所有订阅、事件、Disposable。

sequenceThatErrors
    .retry(3)
    .debug()
    .subscribe(onNext: { print($0) })
    .addDisposableTo(disposeBag)

实践(封装CoreBluetooth)

PTRxBluetooth主要分为三个类:

上一篇下一篇

猜你喜欢

热点阅读