当前位置: 首页 > news >正文

RxSwift-事件属性

一、封装类型

下面是 RxCocoa 中常见的这类封装类型:

类型所属库是否继承自 Observable<T>用途说明
BehaviorRelayRxCocoa❌(封装了 BehaviorSubject可变状态持有者,适合 ViewModel
PublishRelayRxCocoa❌(封装了 PublishSubject广播事件,无初始值,无终止
DriverRxCocoa❌(封装 Observable保证主线程、无 error、shareReplay
SignalRxCocoa❌(封装 Observable类似 Driver,但不保留最新值(无 replay)
ControlPropertyRxCocoa❌(封装)用于 UI 控件的双向绑定,例如 textField.rx.text
ControlEventRxCocoa❌(封装)只发送 .next,适合按钮点击等 UI 事件
BinderRxCocoaUI 安全的绑定器,用于绑定值到控件属性上
  1. BehaviorRelay

  2. PublishRelay

  3. Driver

  4. Signal

  5. ControlProperty

  6. ControlEvent

  7. Binder

二、非封装类型

2.1 、在 RxSwift 中(这些才是“直接继承自 Observable<T>” 的主要类型):

这些是 Rx 标准库中明确 继承自 Observable<T>Subject 类型

类型名继承自是否持值是否 replay是否可发送 error/completed
PublishSubject<T>Observable<T>
BehaviorSubject<T>Observable<T>✅(最后一个)
ReplaySubject<T>Observable<T>✅(全部)
AsyncSubject<T>Observable<T>✅(最后一个,onCompleted 时发送)
Observable<T> 本身✅(按定义)按操作符行为决定✅(除非封装)

1️⃣ PublishSubject<T>
let subject = PublishSubject<String>()subject.onNext("🔥") // 订阅前发送,不会被收到subject.subscribe(onNext: { print("Subscriber:", $0) })subject.onNext("A")
subject.onNext("B")// 输出:A、B2️⃣ BehaviorSubject<T>
let subject = BehaviorSubject(value: "默认")subject.onNext("A")subject.subscribe(onNext: { print("订阅者1:", $0) })
// 输出:订阅者1: Asubject.onNext("B")
// 输出:订阅者1: B3️⃣ ReplaySubject<T>
let subject = ReplaySubject<String>.create(bufferSize: 2)subject.onNext("1")
subject.onNext("2")
subject.onNext("3")subject.subscribe(onNext: { print("订阅者:", $0) })
// 输出:2、3(只 replay 最近两条)4️⃣ AsyncSubject<T>
let subject = AsyncSubject<String>()subject.onNext("A")
subject.onNext("B")subject.subscribe(onNext: { print("订阅者:", $0) })subject.onNext("C")
subject.onCompleted() // 此时才发送 "C"
// 输出:订阅者: C5️⃣ Observable<T> 本身
✅ 特点:
是所有响应式流的基础类型;所有 Subject、Driver、Relay、UI 控件 .rx. 都是基于它构建的;支持无限种组合操作符:map, flatMap, merge, zip, retry, filter, takeUntil, 等。

✅ 使用建议对比总结

类型推荐用途是否持值是否 replay注意事项
PublishSubject纯事件流(点击、导航、通知)不 replay,注意订阅时机
BehaviorSubject状态保存与同步(如 ViewModel 状态)✅(1个)必须提供初始值
ReplaySubject保留历史(聊天、日志)✅(N个)注意内存泄漏风险
AsyncSubject只关注最终值(如结果)✅(最后一个)需手动 .onCompleted()
Observable一切响应式的基础,建议统一转成它❌(除非操作符指定)默认不 replay,需合理组合

2.2 用于 UI 绑定时表现为 Observable

RxCocoa 中的大多数类型是封装的,不是直接继承自 Observable<T>。但有一些 返回值或属性 本身就是 Observable<T> 类型(虽然这些不是继承类,但用于 UI 绑定时表现为 Observable):

类型实际返回类型是否 Observable<T>
textField.rx.textControlProperty<String?>✅(内含 Observable)
button.rx.tapControlEvent<Void>✅(内含 Observable)
scrollView.rx.contentOffsetControlProperty<CGPoint>

三、常见类型是否 replay 总结

类型/方法名是否 replayreplay 的值数量说明
PublishSubject❌ 否0不保存历史
BehaviorSubject✅ 是最近 1 个值必须有初始值
ReplaySubject(1)✅ 是指定数量(如 1)可以自定义回放数量
Driver✅ 是1(等价于 shareReplay(1))保证 UI 始终拿到最新值
Signal❌ 否0适合一次性事件,如弹窗

一、BehaviorRelay

  •  ehaviorRelay 是 RxCocoa 提供的一个 可读写的响应式变量容器,本质上是对 BehaviorSubject 的封装;
  • 更符合响应式思想(取消了 .onNext(),改为 .accept()),不会发送 .completed / .error 事件(永远不会终止);

1.1 使用

一、创建
let relay = BehaviorRelay(value: "Hello")三、更新值
可以通过 .accept(newValue) 更新值
可以通过 .asObservable() 暴露为只读流二、获取值的两种方式第一种 let name = relay.value  // 只是读取当前值
无法监听未来变化;不具备 Rx 的响应式特性
第二种
每次 .accept(...) 修改值,都会通知所有订阅者;
relay.asObservable().subscribe(onNext: { value inprint("监听到了变化:\(value)")})可以组合多个流(combineLatest、flatMap等);

二、BehaviorSubject

三、 PublishSubject

https://chatgpt.com/c/6874d5c3-ae34-800b-8efb-9201a317b6a2

http://www.lryc.cn/news/594347.html

相关文章:

  • 玄机——第六章 流量特征分析-蚂蚁爱上树
  • 全面解析 JDK 提供的 JVM 诊断与故障处理工具
  • Linux之dpkg--命令的用法
  • MySQL EXPLAIN 解读
  • linux shell从入门到精通(一)——为什么要学习Linux Shell
  • 【OD机试】池化资源共享
  • 小架构step系列20:请求和响应的扩展点
  • OPC UA, CAN, PROFINET, SOCKET, MODBUS, HTTP, S7七种物联网常用协议解释
  • 2.组合式API知识点(1)
  • 【并集查找 二分图】P6185 [NOI Online #1 提高组] 序列|省选-
  • JavaScript 对象操作、继承与模块化实现
  • 基于单片机的数字温度计设计
  • Ubuntu 部署 STUN 与 TURN 服务器
  • BLIP、InternVL Series(下)
  • 从TPACK到TPACK - AI:人工智能时代教师知识框架的重构与验证
  • 血条识别功能实现及原理
  • Mobile Neural Network (MNN) 3.2.1
  • CAN通讯理论与实践:调试和优化全讲解
  • EPLAN 电气制图(十): 继电器控制回路绘制(下)放料、放灰
  • UDP中的单播,多播,广播(代码实现)
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • Linux场景常见的几种安装方式
  • VSCode使用Jupyter完整指南配置机器学习环境
  • 在服务器无网络的环境下安装 VS Code Remote-SSH 组件
  • (5)从零开发 Chrome 插件:Vue3 Chrome 插件待办事项应用
  • 数控调压BUCK电路 —— 基于TPS56637(TI)
  • Spring Cloud Gateway高危隐患
  • jmeter如何做自动化接口测试?
  • jQuery多库共存
  • http基础一