RxSwift笔记二Subject

一.简介

git地址: https://github.com/ReactiveX/RxSwift
    参考资料:http://t.swift.gg/d/2-rxswift
    
    ReactiveX是经过可观察的流实现异步编程的一种API,它结合了观察者模式、迭代器模式和函数式编程的精华,RxSwift 是 ReactiveX 编程思想的一种实现。
复制代码

Subjct

Subject既是一个Observer,又是一个Observable,它能够订阅Observable,有能够被其余的Observer订阅,它能够传递/转发做为Observer收到的值,也能够主动发射值.
Subject分为4类:PublishSubject,ReplaySubject,BehaviorSubject,Variable
复制代码

1.PublishSubject

PublishSubject当被观察者订阅时,观察者会收到PublishSubject在订阅后发出的数据.也就是说,这里会存在数据丢失的问题,若是须要所有数据,可以使用ReplaySubject.
复制代码

发生错误时:

let bag = DisposeBag()
let publishSubject = PublishSubject<String>()

publishSubject.subscribe { e in
    print("Subscription: 1, event: \(e)")
    }.addDisposableTo(bag)

publishSubject.on(.Next("a"))
publishSubject.on(.Next("b"))

///这里不会收到'a','b'
publishSubject.subscribe { e in 
    print("Subscription: 2, event: \(e)")
    }.addDisposableTo(bag)

publishSubject.on(.Next("c"))
publishSubject.on(.Next("d"))
复制代码

ReplaySubject

不论观察者什么时候订阅ReplaySubject,观察者均可以收到完整的数据.
复制代码

let bag = DisposeBag()
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)

replaySubject.subscribe { e in
    print("Subscription: 1, event: \(e)")
    }.addDisposableTo(bag)

replaySubject.on(.Next("a"))
replaySubject.on(.Next("b"))

///这里会收到四个数据
replaySubject.subscribe { e in 
    print("Subscription: 2, event: \(e)")
    }.addDisposableTo(bag)

replaySubject.on(.Next("c"))
replaySubject.on(.Next("d"))
复制代码

BehaviorSubject

当观察者订阅一个BehaviorSubject时,BehaviorSubject会发送被订阅前最近一次的数据给观察者,若是没有数据,则会发送一个默认值,以后正常发送数据.
BehaviorSubject有一个好处就是当被订阅时,至少能够收到最新的一个值。
复制代码

let bag = DisposeBag()
let behaviorSubject = BehaviorSubject(value: "z")
behaviorSubject.subscribe { e in
    print("Subscription: 1, event: \(e)")
    }.addDisposableTo(bag)

behaviorSubject.on(.Next("a"))
behaviorSubject.on(.Next("b"))

behaviorSubject.subscribe { e in /// 咱们能够在这里看到,这个订阅收到了三个数据
    print("Subscription: 2, event: \(e)")
    }.addDisposableTo(bag)

behaviorSubject.on(.Next("c"))
behaviorSubject.on(.Next("d"))
behaviorSubject.on(.Completed)
复制代码

Variable

Variable 是 BehaviorSubject 的一个封装.相比 BehaviorSubject ,它不会由于错误终止也不会正常终止,是一个无限序列,一样具有了缓存最新值和提供默认值的能力.可是Variable没有on系列方法,只提供了value属性.直接对value进行set等同于调用了onNext()方法.这代表了Variable不会发射error也不会发射completed.在Variable被销毁的时候会调用发射completed给Observer.在订阅Variable的时候,咱们没法直接调用subscribe方法,须要先调用asObservable()方法。
```
let variable = Variable<Int>(1)
variable.asObservable().subscribe({ (event) in
    print("Event:\(event)")
})
variable.value = 2
/// Event:next(1)
///Event:next(2)
///Event:completed
```
复制代码

注:

部份内容摘自其余博客,若有侵权,请及时告知删除!复制代码
相关文章
相关标签/搜索