一起养成写作习气!这是我参加「日新方案 4 月更文挑战」的第2天,点击检查活动概况。
咱们之前学习了RxSwit
在编程的思想,以及在Swift中对咱们常用控件等进行rx的运用,本文首要简单介绍RxSwit序列中心逻辑
。
1. 可调查序列 – Observable
Observable
序列能够是有限
的也能够是无限
的。比方咱们的网络恳求便是有限的,而定时器是无限的,一向不断产生变化。
- 无量序列
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)
关于初始化数组便是订阅了它变化
,以及序列完结
,毁掉
- 过错
关于
过错的订阅
,比方咱们恳求一个过错的网络恳求
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)
打印成果
不管是有穷的序列还是无量的序列都是对序列创立,订阅,毁掉
。
咱们创立一个序列,检查它的流程
//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
表示发送一次信号,onError
和onCompleted
是互斥的,都代表完毕了序列,其流程和咱们上面的图一样。
2. 序列的中心逻辑
2.1 创立序列
咱们履行回调实质是闭包的调用,咱们经过onNext()
传值,履行下面的回调。咱们检查create
的创立
持续点击检查AnonymousObservable
初始化
首要是一个初始化的结构办法
和run
的实列办法,经过初始化保存
咱们传过来的闭包subscribeHandler
。
2.2 订阅序列
- 持续看下
subscribe
该办法传入一个闭包,回来一个Disposable
。Disposable
是用于收回
序列的,你能够在闭包onDisposed
中传入,不然系统帮你创立。之后创立调查者observer
,传入一个尾随闭包
。该闭包中根据event枚举
进行不同的回调。能够发现其间error
和complete
是会有disposable.dispose()
,表示完毕
这个序列。
asObservable()
咱们经过Observable<Any>.create
创立了序列,之后经过subscribe
创立了observer
,那么他们怎么联系的呢?咱们能够看到最终一句
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
关于asObservable()
协议ObservableConvertibleType
中定义了这个办法,咱们的Observable
序列都遵从
了这个协议
类似咱们oc中类型的强制转换
比方咱们oc中的类都承继于NSObject
那么咱们子类都能够转换为NSObject
,
这儿咱们回来的self
本身,也便是AnonymousObservable
,也是Observable<E>
的类型,因此咱们能够运用subscribe
办法。
subscribe(observer)
这儿相当于咱们把之前创立的序列经过subscribe
把调查者
传递到了observe序列
中,之后履行闭包中的回调
,做到了你中有我,我中有里。只要发送event
的事情就能触发回调,做到了响应式
。
咱们之前在序列AnonymousObservable
中没有发现 subscribe
的完成办法,可是它承继父类Producer
Producer
重写了Observale的subscribe
的办法,里面调用本身run
办法,传入咱们外面传入的调查者observer
。先创立一个AnonymousObservableSink
目标并持有observer
,然后调用这个目标的run
办法把self
传递过去,也便是把observable作为参数
。 AnonymousObservableSink
这个类将可调查者Observable
和调查者Observer
链接起来,完成事情的传递,起到一个桥梁
的效果。
-
sink.run
,经过事务下沉,让分工更加明确
这儿会回调咱们之前创立序列observe
的回调,因此在首次订阅的时分会触发序列的回调。持续看AnyObserver(self)
这儿初始化结构的时分,咱们创立了一个结构体AnyObserver
保存了一个信息AnonymousObservableSink .on 函数
。
保存了咱们的AnonymousObserver的event
事情
2.3 发送信号
经过上面的剖析可知,在订阅的时分会走一次subscribeHandler
的回调。咱们之前在里面调用了 obserber.onNext("hello")
里面先调用了AnyObserver
遵从协议的on
办法,也便是回调了event
事情,咱们在event
的事情中传递了.next
,并带有咱们的参数element
。咱们的on办法来做AnonymousObservableSink.on
因此会进入下面的办法
self.forwardOn(event)
这也是履行的中心代码,由于AnonymousObservableSink
承继Sink
这儿还有封装
其间self._observer
便是咱们初始化保存的调查者:AnonymousObserver
,也便是最终会调用咱们初始化AnonymousObserver
的时分的闭包回调
3. 总结
序列创立的时分,创立匿名序列AnonymousObservable
,保存subscribeHandler
。序列进行subscribe
订阅的时分创立调查者AnonymousObserver
并保存eventHandler
,调用run
办法进行subscribeHandler
的回调。发送信号则经过onNext()
等调用调查者AnonymousObserver
的onCore
进行_eventHandler(event)
事情回调。流程图如下所示: