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

超详细!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.xdnf.cn/news/335665.html

相关文章:

  • 《供应链网络攻击的风险与防范》
  • OpenHarmony 5.0 切换已连接过的wifi切换失败
  • 普通IT的股票交易成长史--20250508晚复盘
  • python学生作业提交管理系统-在线作业提交系统
  • 搭建电商独立站跨境电商反向海淘系统的过程中网站健康运营的指标
  • 前端开发中移动端调试的日常工具整理
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.4 数据故事化呈现(报告结构设计/业务价值提炼)
  • 多线程初阶(2)
  • 【数据结构】01Trie
  • 【MySQL】存储引擎 - InnoDB详解
  • 大语言模型主流架构解析:从 Transformer 到 GPT、BERT
  • 矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践
  • 【SpringMVC】详解cookie,session及实战
  • PostgreSQL 的 pg_start_backup 函数
  • VR博物馆,足不出户云逛展
  • SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
  • 面向小型企业顶点项目的网络安全咨询人机协作框架
  • 自然语言到 SQL 转换:开启智能数据库交互新时代
  • C++入门小馆 :多态
  • 裸辞8年前端的面试笔记——JavaScript篇(一)
  • uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘
  • Docker部署常见应用之Superset
  • Linux 网络管理 的实战代码示例
  • C27-简单选择排序法
  • Matlab B级路面激励下集中驱动、轮边驱动和主动减振车辆
  • 人工智能可信度新突破:MIT改进共形分类助力高风险医学诊断
  • 【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
  • vite 初始化react项目
  • UV使用官网
  • C++GO语言微服务和服务发现