超详细!RxSwift 中的 BehaviorRelay 使用教程(含原理 + 示例 + 实战)

目录

前言

1.什么是 BehaviorRelay

2.基本使用方式

3.BehaviorRelay的常用API

4.BehaviorRelay 和其它类型的对比

5.BehaviorRelay的使用场景

1.绑定UITableView

2.MVVM 场景下使用 BehaviorRelay

6.使用注意事项以及建议

1.注意事项

2.使用建议总结

7.推荐阅读


前言

        在 iOS 开发中,使用 RxSwift 构建响应式架构(如 MVVM)越来越流行。我们经常会遇到“需要持有某个状态值,并且随时通知观察者”的需求,这时你会发现 BehaviorRelay 几乎无处不在。

        今天这篇文章,我们就来深入剖析 BehaviorRelay 是什么、怎么用、适合用在什么场景中,以及实战中的最佳实践。

1.什么是 BehaviorRelay

        BehaviorRelay 是 RxCocoa 中封装的一个类,用于代替旧版的 Variable(已废弃)。它有以下几个特点:

  1. 持有当前值,可以通过 .value 获取

  2. 可以更新值,使用 .accept(_:) 方法

  3. 可以对外暴露为Observable

  4. 不会发送 error或completed,所以永远不会中断

本质上,它是对 RxSwift 的 BehaviorSubject 的一个安全封装,去掉了 .onError() 和 .onCompleted(),适合用作状态容器。

2.基本使用方式

import RxSwift
import RxCocoalet disposeBag = DisposeBag()// 1. 创建一个初始值为 0 的 BehaviorRelay
let relay = BehaviorRelay<Int>(value: 0)// 2. 订阅它
relay.asObservable().subscribe(onNext: { value inprint("当前值:\(value)")}).disposed(by: disposeBag)// 3. 修改它的值
relay.accept(1)  // 输出:当前值:1
relay.accept(5)  // 输出:当前值:5

3.BehaviorRelay的常用API

API

说明

.value

当前持有的值(同步获取)

.accept(_:)

接受一个新值,会触发订阅回调

.asObservable()

转为只读的 Observable,防止外部直接修改

.bind(to:) / .drive(_:)

可以与 UI 控件绑定

4.BehaviorRelay 和其它类型的对比

特性

BehaviorRelay

PublishRelay

BehaviorSubject

持有当前值

✅ 是

❌ 否

✅ 是

获取当前值

✅ .value

❌ 无

✅ .value

是否可变

✅ .accept()

✅ .accept()

✅ .onNext()

是否会终止

❌ 不会

❌ 不会

✅ .onCompleted() 或 .onError()

推荐场景

状态管理

事件传递

不推荐直接使用(易误用)

5.BehaviorRelay的使用场景

1.绑定UITableView

let items = BehaviorRelay<[String]>(value: ["苹果", "香蕉", "橘子"])items.bind(to: tableView.rx.items(cellIdentifier: "cell")) { row, element, cell incell.textLabel?.text = element}.disposed(by: disposeBag)// 添加新元素
var current = items.value
current.append("榴莲")
items.accept(current)  // 表格会自动刷新
✅ BehaviorRelay 是 TableView/CollectionView 数据源绑定的理想选择。

2.MVVM 场景下使用 BehaviorRelay

        在MVVM架构中,我们常常把 BehaviorRelay 放到 ViewModel 中作为状态容器:

class ContactListViewModel {let contacts = BehaviorRelay<[String]>(value: [])func addContact(_ name: String) {var list = contacts.valuelist.append(name)contacts.accept(list)}
}

        ViewController 中绑定:

viewModel.contacts.bind(to: tableView.rx.items(cellIdentifier: "cell")) { row, name, cell incell.textLabel?.text = name}.disposed(by: disposeBag)

6.使用注意事项以及建议

1.注意事项

  • 不要滥用 .accept(),应限制数据修改权限在 ViewModel 或管理器中

  • .value 是同步获取,不会触发订阅回调

  • 若只需要事件传递(如点击),请用 PublishRelay,不要用 BehaviorRelay

  • BehaviorRelay 永远不会发送 .completed 或 .error,也无法手动终止它

2.使用建议总结

场景

是否推荐使用 BehaviorRelay

表示状态(布尔、列表、数值等)

✅ 推荐

控制 UI 状态(按钮是否可点等)

✅ 推荐

事件传递(点击事件、跳转等)

❌ 不推荐 → 用 PublishRelay

需要流结束、错误处理的场景

❌ 不适合 → 用 Observable 或 Subject

7.推荐阅读

  • RxSwift 官方文档

  • RxCocoa BehaviorRelay 源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-grid-layout实现拖拽修改工作台布局

效果图 vue-grid-layout 文档地址&#xff1a;vue-grid-layout 官网介绍&#xff1a; 使用 // 安装&#xff1a; npm install vue-grid-layout --save// 引用&#xff1a; import { GridLayout, GridItem } from vue-grid-layout// 注册&#xff1a; components:{ GridLay…

windows使用bat脚本激活conda环境

本文不生产技术&#xff0c;只做技术的搬运工&#xff01;&#xff01;&#xff01; 前言 最近需要在windows上使用批处理脚本执行一些python任务&#xff0c;但是被自动激活conda环境给卡住了&#xff0c;研究了一下解决方案 解决方案 call your_conda_path\Scripts\activa…

u-boot学习笔记(四)

文章目录 cmd/sub_cmd/exit.cdo_exit()exit.c可提供的命令及使用方式&#xff1a; ext2.cdo_ext2ls()do_ext2load()ext2.c可提供的命令及使用方式&#xff1a; ext4.cdo_ext4_size()do_ext4_load()do_ext4_ls()do_ext4_write()ext4.c可提供的命令及使用方式&#xff1a; fastbo…

OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…

《React Native热更新实战:用Pushy打造无缝升级体验》

《React Native热更新实战:用Pushy打造应用“空中加油”,实现无缝升级体验》 写在前面:当你的APP需要"空中加油"时… 想象一下这样的场景:凌晨2点,你的React Native应用刚上线就爆出重大BUG,用户差评如潮水般涌来,应用商店审核至少需要3天…此刻你多么希望能…

《社交应用架构生存战:React Native与Flutter的部署容灾决胜法则》

React Native和Flutter作为当下热门的跨平台开发框架&#xff0c;在社交应用开发领域各显神通。今天&#xff0c;我们深入探索它们在高可用架构中的部署与容灾策略。 React Native凭借其独特优势&#xff0c;在社交应用开发中拥有一席之地。它基于JavaScript和React&#xff0…

网络靶场基础知识

一、网络靶场的核心概念 网络靶场&#xff08;Cyber Range&#xff09;是一种基于虚拟化和仿真技术的网络安全训练与测试平台&#xff0c;通过模拟真实网络环境和业务场景&#xff0c;为攻防演练、漏洞验证、安全测试和人才培养提供安全可控的实验空间。其核心目标是通过“虚实…

AutoGen 框架解析:微软开源的多人 Agent 协作新范式

一、引言 在大语言模型&#xff08;LLM&#xff09;快速发展的今天&#xff0c;复杂任务的自动化协作需求日益增长。微软开源的AutoGen 框架&#xff08;GitHub Star 超 10 万&#xff09;提供了一种基于多智能体对话的协作范式&#xff0c;通过自然语言交互实现多角色 Agent …

极简远程革命:节点小宝 — 无公网IP的极速内网穿透远程解决方案

极简远程革命&#xff1a;节点小宝&#xff0c;让家庭与职场无缝互联 ——打破公网桎梏&#xff0c;重塑数字生活新体验 关键词&#xff1a;节点小宝&#xff5c;内网穿透&#xff5c;P2P直连&#xff5c;家庭网络&#xff5c;企业协作&#xff5c;智能组网节点小宝&#xff5…

【MySQL】存储引擎 - CSV详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

云原生安全治理体系建设全解:挑战、框架与落地路径

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:云原生环境下,安全治理正在被重构 在传统IT架构中,安全防护多依赖边界设备(如防火墙、WAF、堡垒机)进行集中式防护。然而,在云原生环境下,这种“边界式”安全模型正面临颠覆。 应用微服务化…

SiC MOSFET同步Buck DC-DC变换器的宽频混合EMI滤波器设计

摘要由于 SiC MOSFET 在高速开关电源中的广泛应用&#xff0c;导致严重的电磁干扰&#xff08;EMI&#xff09;问题&#xff0c;因此 EMI 滤波器的设计成为研究热点。为了满足电磁兼容&#xff08;EMC&#xff09;标准&#xff0c;无源 EMI 滤波器可以有效地降低 DC-DC 变换器产…

[java八股文][Java并发编程面试篇]场景

多线程打印奇偶数&#xff0c;怎么控制打印的顺序 可以利用wait()和notify()来控制线程的执行顺序。 以下是一个基于这种方法的简单示例&#xff1a; public class PrintOddEven {private static final Object lock new Object();private static int count 1;private stat…

MySQL的索引和事务

目录 1、索引 1.1 查看索引 1.2 创建索引 1.3 删除索引 1.4 索引的实现 2、事务 1、索引 索引等同于目录&#xff0c;属于针对查询操作的一个优化手段&#xff0c;可以通过索引来加快查询的速度&#xff0c;避免针对表进行遍历。 主键、unique和外键都是会自动生成索引的…

Qt 验证自动释放 + 乱码问题(6)

文章目录 验证自动释放&#xff08;对象树上的对象&#xff09;乱码问题的缘由解决乱码问题1. 使用QString2. qDebug() 小结 简介&#xff1a;上一篇文章写到&#xff0c;当new出一个控件对象并且将它挂到对象树上&#xff0c;无需我们手动释放该对象&#xff0c;是因为在一个合…

fastjson2 json.tojsonstring 会自动忽略过滤掉 key: null的数据

如果你想在序列化时保留值为 null 的字段&#xff0c;只要打开 Fastjson2 的 WriteNulls 特性即可。常见做法有两种——按调用级别开启&#xff0c;或全局开启。 1. 在每次序列化时加 WriteNulls import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONWriter…

LeetCode热题100--54.螺旋矩阵--中等

1. 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;ma…

别卷手柄了!跨平台VR遥操系统实现仿真

我们构建了一个基于 Quest 3 的 VR 遥操系统&#xff0c;该系统能够同时支持 DISCOVERSE 仿真环境与 MMK2 真机的操控&#xff0c;实现了从虚拟环境到真实机器人系统的无缝对接。 • 基于 VR 实现的遥操系统具有良好的扩展性和便携性&#xff0c;为多场景应用提供了灵活的操作方…

Linux复习笔记(一)基础命令和操作

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 一、Linux中的基础命令和操作&#xff08;约30%-40%) 1.用户和组&#xff08;5%左右&#xff09; 1.1用户简介&#xff08;了解&#xff09; 要求&#xff1a;了解&#xff0c;知道有三个用户…

【C语言干货】野指针

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是野指针&#xff1f;二、野指针的三大成因 1.指针未初始化2.指针越界访问2.指针指向已释放的内存 前言 提示&#xff1a;以下是本篇文章正文内容&…