一起养成写作习气!这是我参加「日新方案 4 月更文挑战」的第2天,点击检查活动概况。

咱们之前学习了RxSwit 在编程的思想,以及在Swift中对咱们常用控件等进行rx的运用,本文首要简单介绍RxSwit序列中心逻辑

1. 可调查序列 – Observable

Observable 序列能够是有限的也能够是无限的。比方咱们的网络恳求便是有限的,而定时器是无限的,一向不断产生变化。

RxSwit学习-02-序列的核心逻辑

  • 无量序列
let ob1 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)

比方咱们创立于一个定时器,便是一个无量的序列

  • 有穷序列
let ob2 = Observable.just([1,2,3])
    ob2.subscribe { (arr) in
      print(arr)
    } onError: { error in
      print(error)
    } onCompleted: {
     
      print("completed")
    } onDisposed: {
     
      print("disposed")
    }.disposed(by: disposeBag)

关于初始化数组便是订阅了它变化,以及序列完结毁掉

RxSwit学习-02-序列的核心逻辑

  • 过错 关于过错的订阅,比方咱们恳求一个过错的网络恳求
URLSession.shared.rx.response(request: URLRequest.init(url: URL.init(string: "www.baidu.xx")!))
      .subscribe(onNext: { (respose,data)in
       
      }, onError:{ (error) in
       
        print(error)
       
      }).disposed(by: disposeBag)

打印成果

RxSwit学习-02-序列的核心逻辑

不管是有穷的序列还是无量的序列都是对序列创立,订阅,毁掉

咱们创立一个序列,检查它的流程

//1.创立
    let ob = Observable<Any>.create{ (obserber) -> Disposable in
     
      //3.发送信号
      obserber.onNext("hello")
      obserber.onError(NSError.init(domain: "NetWorkError", code: 400, userInfo: nil))
      //obserber.onCompleted()
      return Disposables.create()
     
    }
    //2.订阅
   
    ob.subscribe(onNext: { (value) in
     
      print(value)
     
    }, onError:{ (error) in
     
      print(error)
     
    } , onCompleted: {
     
      print("订阅完结")
    }, onDisposed: {
      print("订阅毁掉")
    }).disposed(by: disposeBag)

这儿onNext表示发送一次信号,onErroronCompleted是互斥的,都代表完毕了序列,其流程和咱们上面的图一样。

2. 序列的中心逻辑

2.1 创立序列

咱们履行回调实质是闭包的调用,咱们经过onNext()传值,履行下面的回调。咱们检查create的创立

RxSwit学习-02-序列的核心逻辑

持续点击检查AnonymousObservable初始化

RxSwit学习-02-序列的核心逻辑

首要是一个初始化的结构办法run的实列办法,经过初始化保存咱们传过来的闭包subscribeHandler

2.2 订阅序列

  • 持续看下subscribe

RxSwit学习-02-序列的核心逻辑

该办法传入一个闭包,回来一个DisposableDisposable是用于收回序列的,你能够在闭包onDisposed中传入,不然系统帮你创立。之后创立调查者observer,传入一个尾随闭包。该闭包中根据event枚举进行不同的回调。能够发现其间errorcomplete是会有disposable.dispose(),表示完毕这个序列。

  • asObservable()

咱们经过Observable<Any>.create创立了序列,之后经过subscribe创立了observer,那么他们怎么联系的呢?咱们能够看到最终一句

return Disposables.create(
        self.asObservable().subscribe(observer),
        disposable
      )

关于asObservable()

RxSwit学习-02-序列的核心逻辑

协议ObservableConvertibleType中定义了这个办法,咱们的Observable序列都遵从了这个协议

RxSwit学习-02-序列的核心逻辑

类似咱们oc中类型的强制转换比方咱们oc中的类都承继于NSObject那么咱们子类都能够转换为NSObject

这儿咱们回来的self本身,也便是AnonymousObservable,也是Observable<E>的类型,因此咱们能够运用subscribe办法。

  • subscribe(observer)

这儿相当于咱们把之前创立的序列经过subscribe调查者传递到了observe序列中,之后履行闭包中的回调,做到了你中有我,我中有里。只要发送event的事情就能触发回调,做到了响应式

RxSwit学习-02-序列的核心逻辑

咱们之前在序列AnonymousObservable中没有发现 subscribe的完成办法,可是它承继父类Producer

  • Producer

RxSwit学习-02-序列的核心逻辑

重写了Observale的subscribe的办法,里面调用本身run办法,传入咱们外面传入的调查者observer。先创立一个AnonymousObservableSink目标并持有observer,然后调用这个目标的run办法把self传递过去,也便是把observable作为参数AnonymousObservableSink这个类将可调查者Observable和调查者Observer链接起来,完成事情的传递,起到一个桥梁的效果。

RxSwit学习-02-序列的核心逻辑

  • sink.run ,经过事务下沉,让分工更加明确

RxSwit学习-02-序列的核心逻辑

这儿会回调咱们之前创立序列observe的回调,因此在首次订阅的时分会触发序列的回调。持续看AnyObserver(self)

RxSwit学习-02-序列的核心逻辑

这儿初始化结构的时分,咱们创立了一个结构体AnyObserver保存了一个信息AnonymousObservableSink .on 函数

RxSwit学习-02-序列的核心逻辑

保存了咱们的AnonymousObserver的event事情

2.3 发送信号

经过上面的剖析可知,在订阅的时分会走一次subscribeHandler的回调。咱们之前在里面调用了 obserber.onNext("hello")

RxSwit学习-02-序列的核心逻辑

里面先调用了AnyObserver遵从协议的on办法,也便是回调了event事情,咱们在event的事情中传递了.next,并带有咱们的参数element。咱们的on办法来做AnonymousObservableSink.on 因此会进入下面的办法

RxSwit学习-02-序列的核心逻辑

self.forwardOn(event)这也是履行的中心代码,由于AnonymousObservableSink承继Sink这儿还有封装

RxSwit学习-02-序列的核心逻辑

其间self._observer便是咱们初始化保存的调查者:AnonymousObserver,也便是最终会调用咱们初始化AnonymousObserver的时分的闭包回调

RxSwit学习-02-序列的核心逻辑

3. 总结

序列创立的时分,创立匿名序列AnonymousObservable,保存subscribeHandler。序列进行subscribe订阅的时分创立调查者AnonymousObserver并保存eventHandler,调用run办法进行subscribeHandler的回调。发送信号则经过onNext()等调用调查者AnonymousObserveronCore进行_eventHandler(event)事情回调。流程图如下所示:

RxSwit学习-02-序列的核心逻辑