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
  4. 关键概念列表
  5. 疑问

RACCommand vs RACSignal

RACCommand 和 RACSignal 是 ReactiveObjC 中密切相关的两个类,它们的关系主要体现在 动作封装 和 信号管理 上。RACCommand 是一个专门设计用于封装“动作”或“事件”的类,而 RACSignal 是一个用于传递数据流的核心类。RACCommand 使用 RACSignal 来实现其事件的处理和响应。

RACCommand 和 RACSignal 的关系

  1. RACCommand 通过 RACSignal 表示每次执行的结果:

    • 每次执行 RACCommand 时,RACCommand 会创建一个 RACSignal,该信号表示执行的过程和结果。

    • 当我们在初始化 RACCommand 时,传入的 signalBlock 就是一个返回 RACSignal 的闭包,它会被 RACCommand 在每次执行时调用并返回一个新的 RACSignal。

  2. executionSignals 属性管理所有的执行信号:

    • RACCommand 的 executionSignals 是一个信号的信号(即 RACSignal<RACSignal *>),用于发出每次执行 RACCommand 时产生的 RACSignal。

    • 可以通过 executionSignals 订阅每次执行的信号流,并通过 switchToLatest 获取最新的执行信号,这样就能对每次执行的结果进行处理。

  3. enabled 和 executing 信号的辅助控制:

    • enabled 信号控制 RACCommand 是否可以执行,它通常是一个 RACSignal,表明当前状态是否允许执行(比如按钮是否可以点击)。

    • executing 信号则用于表示当前 RACCommand 的执行状态。这个信号在执行中时发出 YES,完成后发出 NO。通过这个信号,可以在操作执行时显示加载指示器等 UI 变化。

  4. errors 信号用于传递执行过程中的错误:

    • 如果 RACCommand 的执行过程产生错误,错误会被捕获到 errors 信号中,方便统一的错误处理。

RACCommand 和 RACSignal 的使用示例

例如,我们可以将一个按钮点击事件封装成 RACCommand 并监听结果:

// 初始化 RACCommand,signalBlock 返回一个 RACSignal
self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    // 返回表示登录请求的信号
    return [self loginSignal];
}];

// 监听执行结果
[self.loginCommand.executionSignals.switchToLatest subscribeNext:^(id result) {
    NSLog(@"登录成功:%@", result);
}];

// 监听执行中的错误
[self.loginCommand.errors subscribeNext:^(NSError *error) {
    NSLog(@"登录失败:%@", error);
}];

// 设置按钮的点击事件
self.loginButton.rac_command = self.loginCommand;

代码解析

  • initWithSignalBlock::每次执行 loginCommand 时都会调用 signalBlock,并返回一个 RACSignal。

  • executionSignals.switchToLatest:通过 switchToLatest 可以获取到每次最新的执行信号,监听登录结果。

  • errors:如果 loginSignal 执行过程中产生错误,它会被捕获到 errors 信号,进行统一错误处理。

总结

  • RACCommand 是动作的封装,而 RACSignal 是数据的载体。

  • 每次执行 RACCommand,都会创建并返回一个 RACSignal 表示执行过程和结果。

  • RACCommand 利用 executionSignals 管理执行信号,并通过 errors 信号来管理错误。

这种关系让 RACCommand 能够以响应式编程的方式管理动作和状态,使得事件的执行逻辑和数据流的处理更加清晰和解耦。

Previous疑问Next有了信号量,为什么还需要RACCommand

Last updated 8 months ago