一、Swift是一种静态语言。静态语言对于数值的传递、响应的回调、通信等有必定的影响。不像OC有运行时,能够动态的发送消息。因此须要RXSwift来弥补静态语言上的不足。html
二、RxSwift的思想是函数响应式编程,很符合Swift函数是一等公民的设计思想,也是之后Swift发展的方向。react
三、RxSwift是ReactiveX家族的一员。了解RxSwift后,能够拓展到ReactiveX家族的其余框架。编程
一、函数式swift
函数来源于数学,用 y = f(x)
表示,其中,y是因变量,x是自变量。y会随着x的变化而变化。设计模式
在swift中,x至关于一个参数,f是函数,y就是函数的结果—返回值。闭包
在必定状况下,x能够表示为 x = f(x)
,则,上面的公式能够变形为 y = f(f(x))
。即一个函数的参数能够是另外一个函数。增长了函数的灵活性。 这就是函数式编程的核心思想。框架
二、函数响应式函数式编程
举例说明:函数
var a: Int = 10
var b: Int = a + 10
复制代码
若是上面的代码中 b 的值须要一直跟随a的值发生变化,咱们须要怎么来实现呢?咱们须要监听a的值变化,而b响应a的变化而变化。这就是OC中的KVO机制。源码分析
可是,很遗憾,Swift中没有KVO键值监听。因此,咱们须要RxSwift来实现更高级更方便的函数响应式编程。
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext:{(value) in
print(value as Any)
})
.disposed(by: disposeBag)
复制代码
self.button.rx.tap
.subscribe(onNext: {(value) in
print("点击了按钮")
})
.disposed(by: disposeBag)
复制代码
self.textFiled.rx.text.orEmpty
.subscribe(onNext: {(text) in
print(text)
})
.disposed(by: disposeBag)
复制代码
self.textFiled.rx.text
.bind(to: self.button.rx.title())
.disposed(by: disposeBag)
复制代码
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnable = true
tap.rx.event.subscribe(onNext: {(tap) in
print(tap.view)
})
.disposed(by: disposeBag)
复制代码
NotificationCenter.default.rx.notifcation(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: {(noti) in
print(noti)
})
.disposed(by: disposeBag)
复制代码
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: {(num) in
print(num)
})
.disposed(by: disposeBag)
复制代码
第一步:建立序列
let ob = Observable<String>.create { (observer) -> Disposable in
return Disposables.create()
}
复制代码
第二步:订阅信号
let _ = ob.subscribe(onNext: { (text) in
print("订阅信息: \(text)")
}, onError: { (error) in
print("error: \(error)")
}, onCompleted: {
print("订阅结束")
}) {
print("已销毁")
}
复制代码
第三步:发送信号
let ob = Observable<String>.create { (observer) -> Disposable in
// 第三步:发送信号
observer.onNext("信息1")
return Disposables.create()
}
复制代码
查看RxSwift源码
因此咱们往上看注释,会发现有一个「seealso」,翻译过来是「另见」。咦,彷佛是须要查看其余文档的意思。而且后面跟了一个连接,那咱们是要去看文档吗?
咱们先来分析一下这个连接,reactivex.io/documentati…,最后指向了一个create文件的html,那咱们猜想是不是源码中有一个Create文件呢,咱们如今项目中来搜索一下
其返回值为AnonymousObservable(subscribe)。一个内部匿名可观察序列类。参数subscribe则为第一步建立序列中的闭包。
同时,在这个文件的下方能找到AnonymousObservable匿名内部可观察序列类的实现
找到源码
分析到这里你们是否是以为很奇怪?第一步的可观察序列有了,第二步的观察者也有了,可是他们之间彷佛没有联系啊,怎么订阅的?以及第三步的发送信号又是如何执行的呢?
咱们找来找去,彷佛只可能在
self.asObservable().subscribe(observer)
复制代码
咱们先看看asObservable(),点击查看一下,咦,点不进去。咱们再点查看一下subscribe(observer),咦,好像也找不到实现。好吧,咱们再往前看是self,self咱们知道是第一步建立的可观察序列
asObservable()
和
subscribe
函数,
asObservable()
的做用仅仅是返回自身self。
咱们再看看subscribe
方法。 内部调用了rxAbstractMethod()
方法。可是通过查看,这个方法并无被实现。分析到这里又分析不下去了。咱们再回想一下,Observable对象是由create
方法建立的。而且其内部是初始化了一个内部匿名可观察序列的实例对象。咱们再回到Create文件查看一下源码。发现其也没有subscribe
函数。
可是能够发现,AnonymousObservable
类是继承至Producer
类,那subscribe
函数会不会是其父类Producer
的方法呢?
经过查看源码
Producer
对象有
subscribe
函数而且经过断点运行会发现,会走到else中的方法。调用了
self.run(observer, cancel: disposer)
。
在下方找到run
函数。发现其内部只有一个rxAbstractMethod()
函数调用。真正的run
函数并无实现。其实,这是一种设计模式。有好奇心的宝宝能够自行了解一下。这里就不展开叙述了。这个run
函数其实刚才咱们已将看到过了,Producer
对象的子类AnonymousObservable
匿名可观察序列类里
在这个方法中,传入了以前建立的匿名观察者AnonymousObserver实例对象。而且建立了一个AnonymousObservableSink
实例对象,并调用了它的run()
函数。咱们看一下这个run()
函数的实现。实际上是调用了parent._subscribeHandler(AnyObserver(self))
。parent
就是AnonymousObservable
的实例。也就是调用了AnonymousObservable._subscribeHandler(AnyObserver(self))
。
咱们在分析第一步建立可观察序列的时候已经知道,这里的_subscribeHandler
保存的其实就是第一步建立可观察序列传入的闭包。如今调用_subscribeHandler
便是执行了这个闭包。而闭包中的方法就是第三步发送信号
。
通过上面的源码分析,已经知道了从建立可观察序列-->订阅信号-->发送信号这一系列的数据流转过程。
observer.onNext()
函数发送信号。以前已经分析过了,在第二步订阅信号的时候,建立了一个内部匿名观察者observer
。这个observer
又是如何传递给第一步建立序列的闭包中的呢?下面咱们就来分析一下。
咱们知道,在第二步订阅信号调用subscribe
的return中,调用了Producer
对象的subscribe
函数,并将observer
做为参数传递过去。而在subscribe
函数中调用子类AnonymousObservable
匿名可观察序列类的run
函数时,将observer
做为参数传递到了run
函数中。
在AnonymousObservable.run
函数中,初始化AnonymousObservableSink
实例时,又将observer
传递给了AnonymousObservableSink
实例对象。并在调用run
函数时,经过AnonymousObservableSink
实例对象建立AnyObserver
实例,从而传递到了建立序列的闭包中,获得一个观察者observer
。
经过调用观察者observer
对象的onNext()
函数,便可调用到第二步订阅信号闭包中的onNext
回调。从而发送已经传递订阅信息。
通过上面的分析过程,RxSwift的源码已经分析完毕。RxSwift的核心原理也了解得比较清晰。可是,RxSwift中所用到的设计模式已经编程思想倒是须要咱们在之后的使用中不断学习已经掌握的。
最后,附上RxSwift的一个源码分析思惟导图,但愿对你们有所帮助。