RxSwift 仅在添加新元素时观察数组变化

Posted

技术标签:

【中文标题】RxSwift 仅在添加新元素时观察数组变化【英文标题】:RxSwift observe array change only when appended new element 【发布时间】:2018-06-09 17:08:29 【问题描述】:

有没有办法只在添加新元素时订阅数组更改?

所以我希望仅在添加新元素时执行以下闭包。

array.asObservable().subscribe(onNext:  array in

).disposed(by: self.bag)

例如,如果从这个数组中删除一个元素,我不希望执行这个闭包。

编辑:

有没有办法只在闭包中添加新的元素?在我的例子中,我附加了不同长度的子序列,所以我不能只看闭包内数组的最后一个元素。

【问题讨论】:

【参考方案1】:

可能是这样的

 let array = Variable<[Int]>([])
        array.asObservable().distinctUntilChanged  $0.count > $1.count.subscribe(onNext: 
            print($0)
        ).disposed(by: disposeBag)

        array.value.append(1) //called
        array.value.append(2) //called
        array.value.remove(at: 0) //not called
        array.value.append(3) //called

【讨论】:

不推荐使用变量以更好地使用 BehaviorRelay 这是正确答案;但是,有没有办法只在闭包中添加新的元素?在我的例子中,我附加了不同长度的子序列,所以我不能只看闭包内数组的最后一个元素。 你的意思是使用过滤器?你能展示你的数组的例子吗? 例如。 var 数组 = [0,1,2];然后我这样做:array.append([3,4,5])。如何在订阅闭包中仅获取新附加的子序列,即 [3,4,5]【参考方案2】:

在这种情况下,您应该使用变量辞职并使用主题。我认为,您的要求应该满足 PublishSubject:

let subjectArray = PublishSubject<[Int]>([])
array.asObservable().subscribe(onNext: 
            print($0)
        ).disposed(by: disposeBag)

当您向 subjectArray 添加新元素时,只会打印新元素。

【讨论】:

以上是关于RxSwift 仅在添加新元素时观察数组变化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxSwift 观察 UITextField 中的文本变化?

RxSwift 观察数组的变化

RXSwift,作为变量的结构体

KnockoutJS:模板未在可观察数组更改时更新(仅在添加时,在删除时有效)

如何在 NSMutableArray 上添加观察者?

RxSwift 观察模型的变化并提出请求