RxSwift之Subject

2018-12-26  本文已影响5人  春暖花已开

RxSwift中的subject,subject是observable和Observer之间的桥梁,一个subject既是一个obserable也是一个observe,它既可以发出事件也可以监听事件
1.publicSubject:订阅publicSubject时,只能接收到订阅他之后发生的事件,subject.onNext()发出onNext事件,对应的还有onError()和onComplete()事件
2.replaySubject:订阅replaySubject时,可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决于bufferSize的大小
3.behaviorSubject:订阅behaviorSubject,可以接收到订阅之前的最后一个事件,这个在tableView中用的比较多,一般就是初始化数据显示空值。

1,Subjects 基本介绍

(1)Subjects 既是订阅者,也是 Observable

(2)一共有四种 Subjects,分别为:PublishSubjectBehaviorSubjectReplaySubjectVariable。他们之间既有各自的特点,也有相同之处:

(3)Subject 常用的几个方法:

2,PublishSubject

(1)基本介绍

(2)时序图

image

(3)使用样例

let disposeBag = DisposeBag()

//创建一个PublishSubject
let subject = PublishSubject<String>()

//由于当前没有任何订阅者,所以这条信息不会输出到控制台
subject.onNext("111")

//第1次订阅subject
subject.subscribe(onNext: { string in
    print("第1次订阅:", string)
}, onCompleted:{
    print("第1次订阅:onCompleted")
}).disposed(by: disposeBag)

//当前有1个订阅,则该信息会输出到控制台
subject.onNext("222")

//第2次订阅subject
subject.subscribe(onNext: { string in
    print("第2次订阅:", string)
}, onCompleted:{
    print("第2次订阅:onCompleted")
}).disposed(by: disposeBag)

//当前有2个订阅,则该信息会输出到控制台
subject.onNext("333")

//让subject结束
subject.onCompleted()

//subject完成后会发出.next事件了。
subject.onNext("444")

//subject完成后它的所有订阅(包括结束后的订阅),都能收到subject的.completed事件,
subject.subscribe(onNext: { string in
    print("第3次订阅:", string)
}, onCompleted:{
    print("第3次订阅:onCompleted")
}).disposed(by: disposeBag)

运行结果如下:

image

3,BehaviorSubject

(1)基本介绍

(2)时序图

image

]

(3)使用样例

let disposeBag = DisposeBag()

//创建一个BehaviorSubject
let subject = BehaviorSubject(value: "111")

//第1次订阅subject
subject.subscribe { event in
    print("第1次订阅:", event)
}.disposed(by: disposeBag)

//发送next事件
subject.onNext("222")

//发送error事件
subject.onError(NSError(domain: "local", code: 0, userInfo: nil))

//第2次订阅subject
subject.subscribe { event in
    print("第2次订阅:", event)
}.disposed(by: disposeBag)

运行结果如下:

image

4,ReplaySubject

(1)基本介绍

(2)时序图

image

(3)使用样例

let disposeBag = DisposeBag()

//创建一个bufferSize为2的ReplaySubject
let subject = ReplaySubject<String>.create(bufferSize: 2)

//连续发送3个next事件
subject.onNext("111")
subject.onNext("222")
subject.onNext("333")

//第1次订阅subject
subject.subscribe { event in
    print("第1次订阅:", event)
}.disposed(by: disposeBag)

//再发送1个next事件
subject.onNext("444")

//第2次订阅subject
subject.subscribe { event in
    print("第2次订阅:", event)
}.disposed(by: disposeBag)

//让subject结束
subject.onCompleted()

//第3次订阅subject
subject.subscribe { event in
    print("第3次订阅:", event)
}.disposed(by: disposeBag)

运行结果如下:

image

5,Variable

(1)基本介绍

注意
Variables 本身没有 subscribe() 方法,但是所有 Subjects 都有一个 asObservable() 方法。我们可以使用这个方法返回这个 VariableObservable 类型,拿到这个 Observable 类型我们就能订阅它了。

(2)使用样例

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let disposeBag = DisposeBag()

        //创建一个初始值为111的Variable
        let variable = Variable("111")

        //修改value值
        variable.value = "222"

        //第1次订阅
        variable.asObservable().subscribe {
            print("第1次订阅:", $0)
        }.disposed(by: disposeBag)

        //修改value值
        variable.value = "333"

        //第2次订阅
        variable.asObservable().subscribe {
            print("第2次订阅:", $0)
        }.disposed(by: disposeBag)

        //修改value值
        variable.value = "444"
    }
}

运行结果如下:

注意:由于 Variable对象在viewDidLoad() 方法内初始化,所以它的生命周期就被限制在该方法内。当这个方法执行完毕后,这个 Variable 对象就会被销毁,同时它也就自动地向它的所有订阅者发出.completed 事件

image

RxSwift使用详解系列

作者:八级大狂风AM
链接:https://www.jianshu.com/p/def6965b0475

上一篇下一篇

猜你喜欢

热点阅读