关于RxSwift中ReplaySubject,你看这个就明白了

最近在复习RxSwift的操作符使用,看到ReplaySubject时,一直感觉网上很多例子讲解的很绕,今天用一个简单的例子来说明一下:

swift 复制代码
import UIKit
//RxSwift是基于Swift语言的Rx标准实现接口库,所以RxSwift里不包含任何Cocoa或者UI方面的类
import RxSwift
//RxCocoa是基于RxSwift针对iOS开发的库,它通过Extension的方法给原生的比如UI控件添加Rx特性,这样更容易订阅和响应这些控件的事件
import RxCocoa
//创建操作符: 如just, of, from, create等,用于创建Observable序列。
//变换操作符: 如map, flatMap, scan等,用于变换序列中的元素。
//过滤操作符: 如filter, take, skip等,用于过滤序列中的元素。
//合并操作符: 如merge, concat, zip等,用于合并多个序列。
//错误处理操作符: 如catchError, retry等,用于处理错误事件。
//实用操作符: 如do, subscribeOn, observeOn等,用于侧效应和线程调度。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let subject = ReplaySubject<String>.create(bufferSize: 1)
                subject.subscribe { event in
                    print("1->\(event)")
                }
                subject.on(.next("a"))
                subject.on(.next("b"))
                subject.subscribe { event in
                    print("2->\(event)")
                }
                subject.on(.next("c"))

    }
}

执行打印的结果为:

swift 复制代码
1->next(a)
1->next(b)
2->next(b)
1->next(c)
2->next(c)

大家在不看我下面的代码解析时,可以先思考一下为什打印这个,下面是代码的逐行解析,看完绝对觉得和划1一样简单:

  1. 创建ReplaySubject
swift 复制代码
let subject = ReplaySubject<String>.create(bufferSize: 1)

注意:创建一个ReplaySubject对象,它可以缓存最近1个事件

  1. 第一个订阅者
swift 复制代码
subject.subscribe { event in print("1->\(event)") }

第一个订阅者订阅subject,将准备接收subject要发出的事件。

  1. 发送事件
swift 复制代码
subject.on(.next("a"))  //发送事件"a"给所有订阅者。
subject.on(.next("b"))  //发送事件"b"给所有订阅者。

此时控制台就会输出:1->next(a) 1->next(b)

  1. 第二个订阅者
swift 复制代码
subject.subscribe { event in print("2->\(event)") }

注意:第二个订阅者订阅subject,由于subject缓存了最近1个事件,它会立即接收到最近的事件"b"。 所以此时控制台就会输出:2->next(b)

  1. 再次发送事件
swift 复制代码
subject.on(.next("c"))  //发送事件"c"给所有订阅者。

此时控制台会输出:1->next(c) 2->next(c)

  1. 站在订阅者的角度分析事件接收顺序
  • 第一个订阅者一开始只接收到"a"和"b",并打印 1->next(a)和 1->next(b),后来新发出的"c"也传递过来,所以也会打印一次1->next(c)。
  • 第二个订阅者接收到缓存的"b"和新发送的"c",所以会打印 2->next(b) 和 2->next(c)。

注意:这里主要让大家理解ReplaySubject中bufferSize的概念,表示可以缓存最近的几个事件,你学废了吗

相关推荐
2501_915909067 小时前
Python 爬虫 HTTPS 实战,requests httpx aiohttp 抓取技巧、证书问题与抓包调试全流程
爬虫·python·ios·小程序·https·uni-app·iphone
00后程序员张11 小时前
iOS 开发环境搭建完整指南 Xcode 安装配置、iOS 开发工具选择、ipa 打包与 App Store 上架实战经验
android·macos·ios·小程序·uni-app·iphone·xcode
折七13 小时前
expo sdk53+ 集成极光推送消息推送 ios swift
前端·javascript·ios
猪哥帅过吴彦祖13 小时前
Flutter 系列教程:布局基础 (上) - `Container`, `Row`, `Column`, `Flex`
前端·flutter·ios
90后的晨仔14 小时前
xcode 16 删除 Provisioning Profiles 文件的有效路径
ios
-晨-风-15 小时前
Flutter 运行IOS真机,提示无法打开“****”
flutter·ios
00后程序员张15 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_9160137415 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者816 小时前
Nginx HTTPS 深入实战 配置、性能与排查全流程(Nginx https
运维·nginx·ios·小程序·https·uni-app·iphone
游戏开发爱好者818 小时前
TCP 抓包分析:tcp抓包工具、 iOS/HTTPS 流量解析全流程
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone