iOS - RxSwift - Subject
2023-09-27 14:25:58 时间
1. AsyncSubject
[译] iOS 里的 MVVM 和 RxSwift 在本文中,我将介绍 iOS 编程中的 MVVM 设计模式以及 RxSwift。本文分为两部分,第一部分简要介绍了设计模式和 RxSwift 的基础知识,而在 第二部分 里,有一个实现了 MVVM 和 RxSwift 的示例项目。
AsyncSubject 将在源 Observable 产生完成事件后 发出最后一个元素 仅仅只有最后一个元素 如果源 Observable 没有发出任何元素 只有一个完成事件。那 AsyncSubject 也只有一个完成事件。
它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止 AsyncSubject 就不会发出任何元素 而是将这个 error 事件发送出来。
/* AsyncSubject 将在源 Observable 产生完成事件后 发出最后一个元素 仅仅只有最后一个元素 如果源 Observable 没有发出任何元素 只有一个完成事件。那 AsyncSubject 也只有一个完成事件。 它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止 AsyncSubject 就不会发出任何元素 而是将这个 error 事件发送出来。 func setupAsyncSubject() { let subject AsyncSubject String () subject .subscribe { print( AsyncSubject 1 Event : ,$0) .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) subject.onNext( ) subject.onNext( ) subject.onCompleted() }
输出:
AsyncSubject 1 Event : next( ) AsyncSubject 1 Event : completed
PublishSubject 将对观察者发送订阅后产生的元素 而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素 你可以通过使用 Observable 的 create 方法来创建 Observable 或者使用 ReplaySubject。
如果源 Observable 因为产生了一个 error 事件而中止 PublishSubject 就不会发出任何元素 而是将这个 error 事件发送出来。
/* PublishSubject 将对观察者发送订阅后产生的元素 而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素 你可以通过使用 Observable 的 create 方法来创建 Observable 或者使用 ReplaySubject。 如果源 Observable 因为产生了一个 error 事件而中止 PublishSubject 就不会发出任何元素 而是将这个 error 事件发送出来。 func setupPublishSubject() { let subject PublishSubject String () subject .subscribe {print( PublishSubject 1 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) subject .subscribe {print( PublishSubject 2 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) subject.onCompleted() }
输出:
PublishSubject 1 Event: next( ) PublishSubject 1 Event: next( ) PublishSubject 1 Event: next( ) PublishSubject 2 Event: next( ) PublishSubject 1 Event: next( ) PublishSubject 2 Event: next( ) PublishSubject 1 Event: completed PublishSubject 2 Event: completed
ReplaySubject 将对观察者发送全部的元素 无论观察者是何时进行订阅的。
这里存在多个版本的 ReplaySubject 有的只会将最新的 n 个元素发送给观察者 有的只会将限制时间段内最新的元素发送给观察者。
如果把 ReplaySubject 当作观察者来使用 注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用 将造成意想不到的结果。
/* ReplaySubject 将对观察者发送全部的元素 无论观察者是何时进行订阅的。 这里存在多个版本的 ReplaySubject 有的只会将最新的 n 个元素发送给观察者 有的只会将限制时间段内最新的元素发送给观察者。 如果把 ReplaySubject 当作观察者来使用 注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用 将造成意想不到的结果。 func setupReplaySubject() { /// Creates new instance of ReplaySubject that replays at most bufferSize last elements of sequence. /// - parameter bufferSize: Maximal number of elements to replay to observer after subscription. /// - returns: New instance of replay subject. let subject ReplaySubject String .create(bufferSize: 1) subject .subscribe{print( ReplaySubject 1 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) subject .subscribe{ print( ReplaySubject 2 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) }
输出:
ReplaySubject 1 Event: next( ) ReplaySubject 1 Event: next( ) ReplaySubject 2 Event: next( ) ReplaySubject 1 Event: next( ) ReplaySubject 2 Event: next( ) ReplaySubject 1 Event: next( ) ReplaySubject 2 Event: next( )
/* 当观察者对 BehaviorSubject 进行订阅时 它会将源 Observable 中最新的元素发送出来 如果不存在最新的元素 就发出默认元素 。然后将随后产生的元素发送出来。 如果源 Observable 因为产生了一个 error 事件而中止 BehaviorSubject 就不会发出任何元素 而是将这个 error 事件发送出来。 func setupBehavioreSubject() { let subject BehaviorSubject(value: ) subject .subscribe{ print( BehaviorSubject 1 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) subject .subscribe{ print( BehaviorSubject 2 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ️ ) subject.onNext( ️ ) subject .subscribe{ print( BehaviorSubject 3 Event: , $0)} .disposed(by: disposeBag) subject.onNext( ) subject.onNext( ) }
输出:
BehaviorSubject 1 Event: next( ) BehaviorSubject 1 Event: next( ) BehaviorSubject 1 Event: next( ) BehaviorSubject 2 Event: next( ) BehaviorSubject 1 Event: next( ️) BehaviorSubject 2 Event: next( ️) BehaviorSubject 1 Event: next( ️) BehaviorSubject 2 Event: next( ️) BehaviorSubject 3 Event: next( ️) BehaviorSubject 1 Event: next( ) BehaviorSubject 2 Event: next( ) BehaviorSubject 3 Event: next( ) BehaviorSubject 1 Event: next( ) BehaviorSubject 2 Event: next( ) BehaviorSubject 3 Event: next( )
[译] iOS 里的 MVVM 和 RxSwift 在本文中,我将介绍 iOS 编程中的 MVVM 设计模式以及 RxSwift。本文分为两部分,第一部分简要介绍了设计模式和 RxSwift 的基础知识,而在 第二部分 里,有一个实现了 MVVM 和 RxSwift 的示例项目。
相关文章
- iOS使用UITableView实现的富文本编辑器
- iMazing2023最新免费版iOS设备管理软件
- IOS WebView控件详解
- iOS最新漏洞可实现“以假乱真”的iCloud密码钓鱼
- iOS - Category 和Extension的区别
- iOS - autoreleasePool
- IOS团队编程规范
- iOS中 iOS10 权限崩溃问题 韩俊强的CSDN博客
- iOS如何添加照片模拟器(附带诉讼)
- [译]如何在 iOS 上实现类似 Airbnb 中的可展开式菜单
- iOS 10 今日控件向后兼容的几个技巧
- 李洪强iOS开发之函数式 编程初窥
- 李洪强iOS开发之使用CycleScrollView实现轮播图
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
- iOS开发多线程篇—自定义NSOperation
- iOS技术面试07:第三方框架
- iOS 4.2 SDK安装
- 看朋友日志发现的一个ios下block相关的内存管理问题,很奇怪,请大家帮忙一起来回答!
- iOS自定义启动界面 附代码