9

我知道BehaviorRelay正在替换,并且Variable两者都以初始值开头,并将其或最新值重播给订阅者。BehaviorSubjectBehaviorRelay

那有什么区别呢?在这种情况下,您会使用其中一种?

4

2 回答 2

9

源文件中所述BehaviorRelay

BehaviorRelay 是BehaviorSubject.

不像BehaviorSubject它不能因错误或完成而终止。

然后,您将使用BehaviorSubject对可能因错误而终止的流进行建模,同时BehaviorRelay向您的 api 用户保证不会出现错误。

于 2020-07-17T05:21:29.733 回答
5

BehaviorSubject 需要创建一个默认初始值 当订阅者来订阅它时,订阅者将立即收到 BehaviorSubjects 发出的最后一个事件。之后,和正常情况一样,它也会收到 BehaviorSubject 之后发出的新事件

//Create a BehaviorSubject
let subject = BehaviorSubject(value: "111")
 
//Subscribe for the first time subject
subject.subscribe {event in
     print("The first subscription:", event)
}.disposed(by: disposeBag)

BehaviorRelay 显示为 Variable 的替代品。它的本质实际上是对 BehaviorSubject 的封装,所以它也必须由一个默认的初始值来创建 BehaviorRelay 具有 BehaviorSubject 的功能,可以将最后一个事件和新创建的事件发送给它的订阅者 与 BehaviorSubject 不同的是,BehaviorRelay 会自动发送一个 .当它被销毁时完成事件,您不能手动将完成或错误事件发送到 BehaviorReply 以结束它。BehaviorRelay 有一个 value 属性,通过它我们可以得到最新的值。可以通过其accept()方法修改该值

//Create a BehaviorRelay with an initial value of 111
let subject = BehaviorRelay<String>(value: "111")
         
//Modify value
subject.accept("222")
         
//The first subscription
subject.asObservable().subscribe {
     print("1st subscription:", $0)
}.disposed(by: disposeBag)
         
//Modify value
subject.accept("333")

如果要将新值合并到原始值,可以结合 value 属性使用 accept() 方法。(这个常用上拉加载函数的形式,BehaviorRelay用来保存所有加载的数据)

于 2020-07-17T09:31:50.613 回答