搬运
一、为什么要使用RxSwift?
本篇作为新手读的懂的RxSwift源码解析系列第零篇,不会过多地介绍RxSwift的优点。因为既然读者已经开始阅读RxSwift的源码了,必然是已经对RxSwift有了一定的了解了,所以这里只简单谈一下笔者的感受。
笔者认为,RxSwift作为一个响应式编程框架,带来的第一个好处在于逻辑的聚合。大家在平常APP开发过程中,会处理大量的用户交互事件,并且会涉及到大量的逻辑跳转,通过闭包、代理、通知、KVO等等方式来传递数据。这就会导致业务逻辑的分散,同一条业务链很可能分散在多个类当中,从而给调试和排错带来难度,也就容易为Bug的出现埋下隐患。而通过RxSwift,则可以通过RxSwift提供的各种操作符实现逻辑的聚合。
RxSwift带来的另一个好处在于响应式的编程思想,将所有的事件都描述成一个可监听的序列,并提供大量功能各异的操作符,通过声明式的语句来完成数据的获取,转换,结合及绑定。
二、为什么要阅读RxSwift源码
在这里,笔者不想说太多关于阅读源码的好处,因为都是套话,只想放一张图:
由于RxSwift是一个高度封装的框架,代码高度抽象,随着不同操作符的作用,其调用链也会变得极度复杂,这就给我们debug带来了巨大的挑战。
没错,为了能够对RxSwift进行调试,这就是笔者阅读RxSwift源码最原始的动力。
三、RxSwift的核心概念
RxSwift的核心概念主要有三个:Observable,Observer,Operator。
Observable
说Observable,需要先说两个协议。ObservableConvertibleType和ObservableConvertibleType。
public protocol ObservableConvertibleType {
associatedtype Element
func asObservable() -> Observable
}
public protocol ObservableType: ObservableConvertibleType {
func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element
}
extension ObservableType {
public func asObservable() -> Observable {
Observable.create { o in self.subscribe(o) }
}
}
ObservableConvertibleType协议定义了一个方法,那就是asObservable(),返回一个Observable。
ObservableType则定义了一个subscribe
Observable就是遵循了ObservableType的class。
综上,Observable就是一个可以通过调用subscribe方法被订阅的可观察序列。
Observer
Observer,就是一个观察者,它也是通过一个协议(ObserverType)实现的:
public protocol ObserverType {
associatedtype Element
func on(_ event: Event)
}
ObserverType定义了一个on(_ event: Event
@frozen public enum Event {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
这是个枚举,定义了RxSwift中三种不同类型的事件:
.next:一个正常的事件
.error:一个错误事件
.completed:一个完成事件
所以,RxSwift最基础最核心的逻辑就出来了:Observable通过subscribe订阅Observer,并且在产生事件时通过Observer的on(_ event:)方法来传递事件。至于事件是如何产生的,我们将在下一篇文章中分析。
Operator
RxSwift中第三个概念叫做Operator(操作符)。
前两个概念解决了事件的产生及传递,但是没有解决一个问题:产生的事件可能并不是我们所需求的,而操作符正好就可以解决这一问题。
比如,我们有一个产生Int事件的序列,但是我们需要的可能是一个String事件的序列,并且我们希望这个String是Int进行了一定的转换后的结果,这时候我们就需要一个操作符:map
Observable.of(1,2,3,4).map { value in
return String(value*2)
}
.subscrib(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
通过map操作符,我们将原始序列发送的Int序列1,2,3,4转换成了String序列"2", "4", "6", "8"。另外常见的操作符还有filter, flatMap,compactMap, withLatestFrom , skip等等,我们会在后续的文章中陆续进行分析。
四、RxSwift的核心逻辑
其实,通过上面对RxSwift三大核心概念的介绍,我们已经大致了解了RxSwift的核心逻辑:
Observable通过Operator转换之后,订阅Observer,实现事件的转换与绑定