新手读的懂的RxSwift源码解析(零)-- 核心概念与核心逻辑

1,154 阅读4分钟

一、为什么要使用RxSwift?

本篇作为新手读的懂的RxSwift源码解析系列第零篇,不会过多地介绍RxSwift的优点。因为既然读者已经开始阅读RxSwift的源码了,必然是已经对RxSwift有了一定的了解了,所以这里只简单谈一下笔者的感受。

笔者认为,RxSwift作为一个响应式编程框架,带来的第一个好处在于逻辑的聚合。大家在平常APP开发过程中,会处理大量的用户交互事件,并且会涉及到大量的逻辑跳转,通过闭包、代理、通知、KVO等等方式来传递数据。这就会导致业务逻辑的分散,同一条业务链很可能分散在多个类当中,从而给调试和排错带来难度,也就容易为Bug的出现埋下隐患。而通过RxSwift,则可以通过RxSwift提供的各种操作符实现逻辑的聚合。

RxSwift带来的另一个好处在于响应式的编程思想,将所有的事件都描述成一个可监听的序列,并提供大量功能各异的操作符,通过声明式的语句来完成数据的获取,转换,结合及绑定。

二、为什么要阅读RxSwift源码

在这里,笔者不想说太多关于阅读源码的好处,因为都是套话,只想放一张图: image.png 由于RxSwift是一个高度封装的框架,代码高度抽象,随着不同操作符的作用,其调用链也会变得极度复杂,这就给我们debug带来了巨大的挑战。 没错,为了能够对RxSwift进行调试,这就是笔者阅读RxSwift源码最原始的动力。

三、RxSwift的核心概念

RxSwift的核心概念主要有三个:Observable,Observer,Operator。

Observable

说Observable,需要先说两个协议。ObservableConvertibleType和ObservableConvertibleType。

public protocol ObservableConvertibleType {
  
    associatedtype Element

    func asObservable() -> Observable<Element>
}
public protocol ObservableType: ObservableConvertibleType {
    func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element
}

extension ObservableType {
    
    public func asObservable() -> Observable<Element> {
        Observable.create { o in self.subscribe(o) }
    }
}


ObservableConvertibleType协议定义了一个方法,那就是asObservable(),返回一个Observable。

ObservableType则定义了一个subscribe<Observer: ObserverType>(_ observer: Observer),即订阅一个Observer.

Observable就是遵循了ObservableType的class。

综上,Observable就是一个可以通过调用subscribe方法被订阅的可观察序列。

Observer

Observer,就是一个观察者,它也是通过一个协议(ObserverType)实现的:

public protocol ObserverType {
    associatedtype Element
    func on(_ event: Event<Element>)
}

ObserverType定义了一个on(_ event: Event)方法,参数是Event类型:

@frozen public enum Event<Element> {
    /// 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<Int>.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的核心逻辑:

rxswift_core_logic.png

Observable通过Operator转换之后,订阅Observer,实现事件的转换与绑定。

五、结语

作为系列文章的第一篇,本文只是简单介绍了RxSwift的核心概念和核心逻辑,至于其具体的实现逻辑,我们将在后续的文章中逐步分析,敬请期待。