在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化

Posted

技术标签:

【中文标题】在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化【英文标题】:In RxCocoa/RxSwift, how to observe BehaviorRelay<[object]> array size changed 【发布时间】:2019-07-24 19:11:09 【问题描述】:

我想订阅一个 BehaviorRelay,并且我想在我们追加或删除元素时执行一些函数。

我使用了 distinctUntilChange 方法

BehaviorRelay<[object]>.asObservable().distinctUntilChanged $0.count != $1.count.subscribe....

但是没有用。我应该尝试什么?我应该尝试使用其他主题或中继来实现此目的吗?

var objects = BehaviorRelay<[Object]>(value: [])
let disposeBag = DisposeBag()

objects.asObservable()
.subscribe(onNext:  (objects) in
//Do something only when appending or removing elements.
).disposed(by: disposeBag)

//For example
let tempObj = objects.value

tempObj.append(newObj)
objects.accept(tempObj)//this will be called

tempObj.removeAll()
objects.accept(tempObj)//this will be called

tempObj.property = "Change Property"
objects.accept(tempObj)//this will NOT be called

【问题讨论】:

【参考方案1】:

来自文档:

参数比较器:计算键值的相等比较器。

我相信您应该使用== 运算符检查相等性。所以,在你的情况下,试试这种方式:

BehaviorRelay<[object]>
    .asObservable()
    .distinctUntilChanged $0.count == $1.count
    .subscribe....

【讨论】:

以上是关于在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化的主要内容,如果未能解决你的问题,请参考以下文章

如何使剔除可观察数组中的对象属性可观察?

在firebase中如何删除所有观察者,而不是特定参考的观察者

如何在多线程 C++ 中拆除观察者关系?

如何观察用户在网页中查看的当前部分?

如何在 RxSwift 中观察对象的属性?

如何在其他控制器AngularJS中观察变量