RxSwift学习(Subject)

推荐书本:RxSwift
电子版地址:https://pan.baidu.com/s/1bp8MlC7 密码 5tjx
本文是RxSwift书本 学习笔记
书本code地址:https://pan.baidu.com/s/1o7GVBrO

Subject 可以看做是一种代理和桥梁。它既是订阅者又是订阅源。
作为一个观察者和观察者。您早就看到了他们如何接收事件并订阅。该主题接收到下一个事件,每次收到一个事件时,它都会将它发送给它的订阅者。

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

func writeSequenceToConsole(name: String, sequence: O) {
    sequence
        .subscribe { e in
            print("Subscription: \(name), event: \(e)")
    }
}

example(of: "PublishSubject") {
    let subject = PublishSubject()
    

    writeSequenceToConsole(name: "1", sequence: subject)
    
    subject.onNext("Is anyone Listeing?")
    subject.on(.next("1"))
    subject.on(.next("2"))
    
    writeSequenceToConsole(name: "2", sequence: subject)
    subject.onNext("Is anyone Listeing?")
    subject.on(.next("1"))
    subject.on(.next("2"))
    
}
RxSwift学习(Subject)_第1张图片
红色为第一组,蓝色为第二组发送, 黄色箭头为 第二次发送发送的事件 被第一组接收

ReplaySubject 在新的订阅对象订阅的时候会补发所有已经发送过的数据队列, bufferSize 是缓冲区的大小,决定了补发队列的最大值。如果 bufferSize 是1,那么新的订阅者出现的时候就会补发上一个事件,如果是2,则补两个,以此类推。(距观察,补发的事件是先进后出)

![Uploading image_072992.png . . .]

example(of: "ReplaySubject") {
    let subject = ReplaySubject.create(bufferSize: 1)
    
    writeSequenceToConsole(name: "1", sequence: subject)
    
    subject.onNext("Is anyone Listeing? 1")
    subject.on(.next("a"))
    subject.on(.next("b"))
    
    writeSequenceToConsole(name: "2", sequence: subject)
    subject.onNext("Is anyone Listeing? 2")
    subject.on(.next("c"))
    subject.on(.next("d"))
}
RxSwift学习(Subject)_第2张图片
红蓝黄和上面一样, 紫色圈出来部分为

========================================

BehaviorSubject
BehaviorSubject 在新的订阅对象订阅的时候会发送最近发送的事件,如果没有则发送一个默认值。

RxSwift学习(Subject)_第3张图片
如图所示。

================================
Variable
Variable 是基于 BehaviorSubject 的一层封装,它的优势是:不会被显式终结。即:不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete 。

================================
Variable
Variable 是基于 BehaviorSubject 的一层封装,它的优势是:不会被显式终结。即:不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete 。
需要通过asObservable()方法来访问其behavior subject.主题

example(of: "Variable") { 
    let variable = Variable("z")
    let disposeBag = DisposeBag()
    variable.value = "new initial"
    variable.asObservable().subscribe{print("1)\($0)")}.addDisposableTo(disposeBag)
}

你可能感兴趣的:(RxSwift学习(Subject))