超詳細!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.pswp.cn/pingmian/79916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79916.shtml
英文地址,請注明出處:http://en.pswp.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;以下是本篇文章正文內容&…