当前位置: 首页 > 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.dtcms.com/a/288883.html

相关文章:

  • Vuex 核心知识详解:Vue2Vue3 状态管理指南
  • Servlet快速入门
  • Docker在NAS部署MoonTV+OrionTV
  • 44.sentinel授权规则
  • tidyverse-数据读入
  • 基于智慧经营系统的学校住宿登记报表分析与应用探究-毕业论文—仙盟创梦IDE
  • 如何防止任务长期处于“等待”状态
  • Python基础和高级【抽取复习】
  • 基于单片机的自动条幅悬挂机
  • Leetcode 06 java
  • SpringBoot的配置文件
  • 【micro:bit】从入门到放弃(四):高级指令:函数、数组、文本、高级LED、引脚配置
  • UE蒙太奇和动画序列有什么区别?
  • 早期SD模型控制生成方法
  • Dev-C++——winAPI贪吃蛇小游戏
  • 智能制造之物料详解
  • 物联网安装调试-温湿度传感器
  • 数学专业转行做大数据容易吗?需要补什么?
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • 本地部署 Claude 大语言模型的完整实践指南
  • 从磁记录到数据中心:磁盘原理与服务器架构的完整技术链路
  • 【C++基础】面试高频考点解析:extern “C“ 的链接陷阱与真题实战
  • 【原创】微信小程序添加TDesign组件
  • 网络安全初级(前端页面的编写分析)
  • 手写tomcat
  • JAVA学习-练习试用Java实现“贝叶斯网络:实现一个简单的贝叶斯网络用于因果推理”
  • Transient Storage
  • Redis通用常见命令(含面试题)
  • [硬件电路-51]:晶体管既可以用于模拟电路芯片,也可以用于数字电路芯片,晶体管应用在这两个领域的相同点和本质区别?
  • Linux之dpkg--命令的用法