iOS - RxSwift - Subject

简介: 参考RxSwift中文文档Github RxSwift

1. AsyncSubject


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


2. PublishSubject


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


3. ReplaySubject


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(🐯)


4. BehaviorSubject


/*
     当观察者对 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(🍐)


相关文章
An工具介绍之宽度工具、变形工具与套索工具
An工具介绍之宽度工具、变形工具与套索工具
2552 0
An工具介绍之宽度工具、变形工具与套索工具
|
传感器 监控 Linux
农业温室大棚数据监控系统的设计与实现
农业温室大棚数据监控系统的设计与实现
1537 0
|
开发框架 前端开发 Java
【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解
【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解
820 0
|
供应链 算法 定位技术
运筹优化技术在供应链领域应用介绍
运筹优化技术在供应链领域应用介绍
1948 0
|
开发框架 安全 PHP
ThinkPHP和Laravel
【8月更文挑战第23天】ThinkPHP和Laravel
584 4
|
人工智能 文件存储 计算机视觉
YOLO系列模型发展史
YOLO系列模型从YOLOv3到YOLOv10,不断优化实时目标检测性能和速度。最新版本YOLOv8增加了实例分割、姿态估计等功能。此外,还包括Segment Anything Model(SAM)、MobileSAM、FastSAM、YOLO-NAS、RT-DETR和YOLO-World等模型,分别在不同场景下提供高效的目标检测和分割能力。
982 0
|
网络协议 安全 网络安全
IPv4 地址耗尽,为什么 IPv6 没有广泛将其取代?
IPv4 地址耗尽,为什么 IPv6 没有广泛将其取代?
809 0
|
运维 监控 安全
在Linux中,如何管理和优化日志文件?
在Linux中,如何管理和优化日志文件?