Front-end
Apple
Apple
  • 第三方库
    • RAC库
      • ReactiveObjc
        • 如何实现的
        • 有关类
        • 有关协议
        • 关键概念列表
          • RACSignal有关类
            • RACStream
              • 头文件定义
            • RACSignal
              • 头文件定义内容
              • 核心代码
              • 常用的方法
                • concat:
                • bind:
                • zipWith 和merge
            • RACSubject
              • 内容
            • RACReplaySubject
              • 内容
            • RACBehaviorSubject
              • 内容
            • RACGroupedSignal
              • 内容
            • RACDynamicSignal
              • RACDynamicSignal
              • RACSignal vs RACDynamicSignal
            • RACReturnSignal
              • 内容
            • RACErrorSignal
            • RACEmptySignal
            • RACChannelTerminal
            • 疑问
              • RACChannelTerminal vs RACSubject
              • RACSignal vs RACStream
              • 热信号和冷信号
                • 进一步理解
              • 信号的发送者和接受者
                • RACSignal 不是信号对象么?为什么信号的发送者是自己呢?
          • RACChannel有关类
            • RACChannel
              • Page 1
              • 用于MVVM架构
              • RAC() vs RACChannelTo()
            • RACKVOChannel
              • 内容
              • 封装了系统的KVO
          • RACCommand
          • RACSubscriber
          • RACTuple
          • RACSequence有关类
          • RACKVOTrampoline
            • NSObject+RACKVOWrapper.h
            • NSObject+RACKVOWrapper.m
          • Page
          • 宏
          • 疑问
            • RACCommand vs RACSignal
            • 有了信号量,为什么还需要RACCommand
        • 操作方法
          • reduce
            • reduce 在不同语言以及库中是否一样的概念?
      • ReactiveSwift
        • 相比ReactiveObjc
      • RxSwift
      • Combine
      • 疑问
        • 热信号 vs 冷信号
        • ReactiveObjC 和 ReactiveSwift 实现原理差异
        • ReactiveObjC、ReactiveCocoa、ReactiveSwift的关系与区别
        • ReactiveObjC、ReactiveCocoa、ReactiveSwift内容
        • ReactiveSwift vs RxSwift
        • RxSwift、ReactiveSwift 和 ReactiveObjC
        • RxSwift、ReactiveSwift 、Combine
    • swift源码
      • 编译
        • 命令参数解释
        • 涉及到的工具
          • cmake 和 ninja
          • sccache
        • Rosetta模式
        • 遇到问题
          • FETCH_HEAD': Permission denied
          • --local_compiler_build': No such file or directory
          • ld: unsupported tapi file type '!tapi-tbd' in YAML file
          • python --version 显示没有这个命令
          • ModuleNotFoundError: No module named 'packaging'
          • ModuleNotFoundError: No module named 'sphinx'
            • sphinx是什么
          • ERROR: Could not find a version that satisfies the requirement sphinx (from versions: none)
          • /Applications/Python\ 3.x/Install\ Certificates.command 失败
          • 已经安装了sphinx,还是显示错误
      • 涉及到的知识点
        • Swift中的MCCAS
Powered by GitBook
On this page
  1. 第三方库
  2. RAC库
  3. 疑问

ReactiveObjC 和 ReactiveSwift 实现原理差异

虽然 ReactiveObjC 和 ReactiveSwift 都是响应式编程框架,并且它们在概念上有很多相似之处,但由于它们基于不同的编程语言(Objective-C 和 Swift),在实现原理上存在一些关键差异。以下是它们的实现原理对比:

1. 信号机制

ReactiveObjC

  • 信号类型:RACSignal 是 ReactiveObjC 的核心类型,表示一个信号流。它遵循观察者模式,允许多个订阅者监听信号的变化。每次订阅都会立即激活并发送事件,所以 RACSignal 是热信号(Hot Signal)。

  • 事件传递:RACSignal 是不可变的,创建时就代表某个事件流。通过 next, error, 和 completed 等 Block 处理事件。

  • 订阅机制:订阅者会订阅一个信号,并通过 Block 监听事件。信号和订阅者之间通过手动管理内存(例如 @weakify 和 @strongify)来避免内存泄漏。

  • 核心机制:

    • RACSubscriber:处理信号的接收者,用于接收 next, error, completed 事件。

    • RACDisposable:用于取消信号的订阅,防止资源泄漏。

    • RACScheduler:调度任务,决定在哪个线程上执行。

ReactiveSwift

  • 信号类型:在 ReactiveSwift 中,信号被分为两种核心类型:

    • Signal:与 RACSignal 类似,它也是一个热信号。事件在创建时就开始发送,无需订阅就可以进行广播。

    • SignalProducer:是冷信号(Cold Signal),意味着信号不会在创建时立即开始发送,只有在订阅时才会启动。这种机制使得每次订阅时会重新执行事件流。

  • 事件传递:事件流由 Event<Value, Error> 表示,利用 Swift 的泛型来保证类型安全。事件分为 .value, .failed, .completed,比 Objective-C 中更加明确。

  • 订阅机制:ReactiveSwift 利用了 Swift 的闭包机制,订阅者通过闭包监听事件。Swift 的内存管理和捕获列表使得内存管理更加简洁,减少了循环引用问题。

  • 核心机制:

    • Observer:类似于 RACSubscriber,用于接收信号的事件。

    • Disposable:用于取消订阅,和 RACDisposable 类似。

    • Scheduler:与 RACScheduler 类似,控制任务的调度和线程分派。

2. 热信号与冷信号

ReactiveObjC

在 ReactiveObjC 中,RACSignal 本质上是一个热信号。这意味着一旦信号被创建,就会开始发送事件。所有的订阅者都会接收相同的事件序列。

ReactiveSwift

在 ReactiveSwift 中,Signal 是热信号,与 RACSignal 类似,立即开始发送事件。而 SignalProducer 是冷信号,只有当订阅者订阅时才会启动,这允许每个订阅者独立地重新执行信号。

3. 内存管理

ReactiveObjC

  • 内存管理:在 Objective-C 中,ARC(Automatic Reference Counting)管理内存,但由于 Objective-C 是基于引用的内存模型,信号与订阅者之间的强引用关系可能导致循环引用问题。ReactiveObjC 使用 @weakify 和 @strongify 来避免这种情况。

ReactiveSwift

  • 内存管理:Swift 同样使用 ARC,但 Swift 的闭包机制提供了更好的内存管理。闭包的捕获列表可以更加精细地控制对象的生命周期,避免了循环引用问题。在 ReactiveSwift 中,闭包通常是弱引用对象,因此不需要像 Objective-C 那样频繁使用 @weakify 和 @strongify。

4. 类型系统

ReactiveObjC

  • 动态类型:Objective-C 是动态类型语言,ReactiveObjC 的信号和事件处理并不依赖于编译时的类型检查。信号传递的值类型通常是 id,这意味着开发者需要在使用时手动进行类型转换,可能导致运行时的错误。

  • 错误处理:错误处理通常使用 NSError,并且没有类型安全的泛型支持,所有错误都是通用的。

ReactiveSwift

  • 静态类型:Swift 是静态类型语言,ReactiveSwift 的信号是类型安全的。Signal 和 SignalProducer 使用泛型来指定值类型和错误类型,编译时可以确保类型安全,大大减少了运行时类型错误。

  • 错误处理:ReactiveSwift 的 Event 使用了 Swift 的泛型和 Result 类型,允许在编译时对错误类型进行明确定义,提供了更好的错误处理方式。

5. 事件处理机制

ReactiveObjC

  • 事件类型:RACSignal 中的事件通过 next、completed 和 error Block 进行处理。由于 Objective-C 没有类似 Swift 的 enum 类型,事件处理是通过 Block 闭包传递的。

ReactiveSwift

  • 事件类型:ReactiveSwift 利用了 Swift 的 enum 类型。事件被封装在 Event 类型中,使用 .value, .failed, .completed, 和 .interrupted 表示。这种方式比 Block 更加清晰,也提高了类型安全性。

6. 调度和并发

ReactiveObjC

  • 调度器:ReactiveObjC 使用 RACScheduler 来控制信号在哪个线程上执行,开发者可以明确指定信号是在主线程还是后台线程上调度的。

ReactiveSwift

  • 调度器:ReactiveSwift 同样使用 Scheduler 来处理并发和线程调度,提供了更多与 Swift 并发模型整合的能力,如与 Swift 的 DispatchQueue 集成。

总结

虽然 ReactiveObjC 和 ReactiveSwift 在概念上相似,但由于语言特性不同,它们的实现原理有显著差异:

  • ReactiveObjC 强调的是基于动态类型的机制,依赖 Block 和手动内存管理,处理信号的机制较为灵活但容易出错。

  • ReactiveSwift 则利用 Swift 的类型安全、泛型和静态分析提供了更加安全和现代化的响应式编程环境。它引入了 SignalProducer 来处理冷信号,使得信号管理更加灵活。

因此,虽然它们的核心思想类似,但实现细节在很多方面由于语言的不同而有所差异。

Previous热信号 vs 冷信号NextReactiveObjC、ReactiveCocoa、ReactiveSwift的关系与区别

Last updated 8 months ago