RxSwift各个组件作用

19 阅读4分钟

想象一下一个自来水处理和供应系统,这个比喻能很好地对应这几个类的职责。


总结表格

类/协议核心角色 (一句话总结)详细职责水厂比喻
Observer最终用户订阅事件流,并定义了如何消费最终送达的事件(.next, .error, .completed)。居民 (在家打开水龙头用水的人)
Observable供水系统蓝图一个抽象基类和协议,定义了所有“事件源”都必须具备 subscribe (被订阅) 的能力。它本身不产出任何事件。市政供水系统规划图 (规定了水源地、管道和水厂的位置)
AnonymousObservable水源地Observable 的具体实现,通过 Observable.create 创建。它内部持有如何产生初始事件的逻辑 (_eventGenerator)。山泉/水库 (水的源头,定义了水流如何开始)
AnonymousObserver水源地的泵站工人AnonymousObservable 的内部协作类。当订阅发生时,它负责启动并执行产水逻辑,并将产生的水(事件)泵入管道。守在水库大坝的工人 (接到供水指令后,打开阀门放水)
MapObservable水处理厂Observable 的另一种实现,代表一个被加工过的事件流。它从上游接收事件,进行转换,再提供给下游。净水厂 (建在管道中途,接收原水,过滤后送出净水)
MapObserver水处理厂的过滤工人MapObservable 的内部协作类。它负责执行具体“转换”操作。接收上游事件,应用 map 闭包,然后将处理过的事件转发给下游。净水厂里操作过滤设备的工人

各个组件的详细解析

1. Observer (最终用户)

  • 作用: 它是事件流的终点。是你,作为框架的使用者,最直接打交道的“消费者”。你创建一个 Observer 实例,并在其中写好处理不同事件的逻辑(比如打印数值、更新 UI 等)。
  • 简单理解: 它只关心结果,等着接收最终的事件通知。

2. Observable (供水系统蓝图)

  • 作用: 这是一个抽象概念,像一个接口或模板。它规定:“任何想要成为事件源的东西,都必须能让别人来订阅你 (subscribe)”。它本身不干活,只是定下规矩。

3. AnonymousObservable (水源地)

  • 作用: 这是你用 Observable.create { ... } 创建的最原始的事件源。花括号 {...} 里的代码,就是“如何从无到有产生事件”的说明书 (_eventGenerator)。
  • 特点: 它很懒,只有当有人来订阅它的时候,它才会开始执行你写好的那段产水逻辑。

4. AnonymousObserver (水源地的泵站工人)

  • 关系: AnonymousObservable 的御用执行者

  • 作用: 当 AnonymousObservable 被订阅时,它不会亲自去执行产水逻辑,而是会立即创建一个 AnonymousObserver 实例。这个实例有两大任务:

    1. 执行任务: 调用 _eventGenerator 闭包,让事件开始产生。
    2. 充当中介: 闭包里产生的事件会先发给它,然后它再负责把事件转发给下一站(可能是 MapObserver,也可能是最终的 Observer)。

5. MapObservable (水处理厂)

  • 作用: 它代表一个中间处理环节。它本身不生产全新的事件,而是“订阅”一个上游的 Observable (比如我们上面说的 AnonymousObservable)。
  • 特点: 它接收上游来的事件,用你提供的 map 闭包进行加工,然后把自己伪装成一个新的 Observable,供下游订阅。

6. MapObserver (水处理厂的过滤工人)

  • 关系: MapObservable 的御用执行者

  • 作用: 当 MapObservable 被订阅时,它会创建一个 MapObserver 实例。这个实例的任务是:

    1. 接收上游来料: 它会把自己注册为上游 Observable 的订阅者,时刻准备接收事件。
    2. 加工处理: 每当收到一个 .next 事件,它就立刻用 map 闭包处理一下事件里的值。
    3. 转发给下游: 把加工好的新事件,转发给它的下游(可能是另一个 MapObserver,也可能是最终的 Observer)。

串联起来看 observable.map { ... }.subscribe(...)

  1. subscribe(observer: finalObserver) : 最终用户 finalObserver 说:“我要订阅 map 之后的水!”

  2. MapObservable 响应: MapObservable (净水厂) 接到指令,说:“好的,我马上派我的工人 MapObserver 去处理。” 于是创建了一个 MapObserver 实例。这个工人知道,处理完的水要送给 finalObserver。

  3. MapObserver 行动: MapObserver (净水厂工人) 为了有水可以处理,它跑去上游的 AnonymousObservable (水源地) 说:“我要订阅你的水!”

  4. AnonymousObservable 响应: AnonymousObservable (水源地) 接到指令,说:“好的,我马上派我的工人 AnonymousObserver 去放水。” 于是创建了一个 AnonymousObserver 实例。这个工人知道,放出来的水要送给 MapObserver。

  5. AnonymousObserver 行动: AnonymousObserver (水源地工人) 开始执行 create 里的代码,打开了水库阀门,事件(原水)开始流出...

  6. 数据流动:

    • AnonymousObserver 收到 .next(1) -> 转发给 MapObserver。
    • MapObserver 收到 .next(1) -> 加工成 .next(2) -> 转发给 finalObserver。
    • finalObserver 收到 .next(2) -> 执行打印。

整个流程清晰地展示了每个组件如何各司其职,通过层层订阅和事件转发,构成了一个健壮、可扩展的响应式数据流。