RxSwift:BehaviorSubject 和 BehaviorRelay 的用法区别是什么?

Ala*_*man 5 behaviorsubject swift rx-swift behaviorrelay

据我所知,BehaviorRelay被取代Variable,两者BehaviorSubjectBehaviorRelay开始与初始值,和重放,或最新值给用户。

那有什么区别呢?在哪种情况下,您会使用一个?

Tem*_*ian 7

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

\n
//Create a BehaviorSubject\nlet subject = BehaviorSubject(value: "111")\n \n//Subscribe for the first time subject\nsubject.subscribe {event in\n     print("The first subscription:", event)\n}.disposed(by: disposeBag)\n
Run Code Online (Sandbox Code Playgroud)\n

BehaviourRelay 是作为 Variable 的替代品出现的。它的本质其实是对BehaviorSubject的封装,所以它也必须通过一个默认的初始值来创建\nBehaviorRelay具有BehaviorSubject的功能,可以将最后一个事件和新创建的事件发送给它的订阅者\n与BehaviorSubject不同的是,BehaviorRelay会自动发送销毁时会产生 .complete 事件,你可以\xe2\x80\x99手动完整的发送完成或错误事件到BehaviorReply来结束它。\nBehaviorRelay 有一个 value 属性,通过它我们可以获得最新的值。可以通过其accept()方法修改该值

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

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

\n


tom*_*ahh 5

源文件中所述BehaviorRelay

BehaviorRelay 是BehaviorSubject.

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

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

  • 这应该是“然后您将使用BehaviorSubject 来建模可能终止的流。(句号)”。主体可以终止,而中继永远不会终止。 (2认同)