学会使用Subjects

Subject是Observable和Observer之间的桥梁,一个Subject既是一个Obserable也是一个Observer,它既可以发出事件,也可以监听事件.

PublishSubject

当你订阅PublishSubject的时候,你只能接收到订阅他之后发生的事件。subject.onNext()发出onNext事件,对应的还有onError()和onCompleted()事件

    // 1.PublishSubject 只能接收到订阅他之后发生的事件
    func publishSubject() {
        print("\n publishSubject test---")
        let disposeBag = DisposeBag()
        let subject = PublishSubject<String>()

        subject.onNext("001") // subscribe之前的不会收到
        subject.subscribe{print($0)}.addDisposableTo(disposeBag)
        subject.onNext("002")
        subject.onNext("003")
    }
   publishSubject test---
   002
   003

ReplaySubject

当你订阅ReplaySubject的时候,你可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小

    // 2.ReplaySubject 可以接收到订阅他之后的事件,也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小
    func replaySubject() {
        print("\n replaySubject test---")
        let disposeBag = DisposeBag()
        let subject = ReplaySubject<String>.create(bufferSize: 1)

        subject.onNext("100")
        subject.onNext("101")
        subject.subscribe{print($0)}.addDisposableTo(disposeBag)
        subject.onNext("102")
        subject.onNext("103")
    }
   replaySubject test---
   101
   102
   103

BehaviorSubject

当你订阅了BehaviorSubject,你会接受到订阅之前的最后一个事件。

    // 3.BehaviorSubject 可以接收到订阅他之后的事件,也可以接受到订阅之前的最后一个事件
    func behaviorSubject() {
        print("\n behaviorSubject test---")
        let disposeBag = DisposeBag()
        let subject = BehaviorSubject(value: "200")

        subject.onNext("201")
        subject.onNext("202")
        subject.subscribe{print($0)}.addDisposableTo(disposeBag)
        subject.onNext("203")
        subject.onNext("204")
    }
   behaviorSubject test---
   202
   203
   204

PublishSubject, ReplaySubject和BehaviorSubject是不会自动发出completed事件的。


Variable

Variable是BehaviorSubject一个包装箱,就像是一个箱子一样,使用的时候需要调用asObservable()拆箱,里面的value是一个BehaviorSubject,他不会发出error事件,但是会自动发出completed事件。

    // 4.Variable是BehaviorSubject一个包装箱,使用的时候需要调用asObservable(),Variable没有on系列方法,只提供了value属性。
    // Variable可以用来储存数据,因为我们可以拥有value的get和set方法
    // 不会发出error事件,但是会自动发出completed事件。
    func variable() {
        print("\n variable test---")
        let disposeBag = DisposeBag()
        let variable = Variable("300")

        variable.value = "301"
        variable.value = "302"
        variable.asObservable().subscribe { print($0)}.addDisposableTo(disposeBag)
        variable.value = "303"
        variable.value = "304"
    }
   variable test---
   300
   302
   303
   304

results matching ""

    No results matching ""