如何使用 RxSwift 订阅数组更改?
Posted
技术标签:
【中文标题】如何使用 RxSwift 订阅数组更改?【英文标题】:How to subscribe on array changes using RxSwift? 【发布时间】:2018-08-20 08:53:25 【问题描述】:我有一个简单的数组:
var similarObjects: [Objects] = []
之后我如何看到他的变化:
similarObjects = someArray
我尝试:(结果:下一个 -> 完成)
_ = Observable.just(similarObjects)
.subscribe( event in
return print(event.element)
)
【问题讨论】:
在 Swift 中它很容易观察对象的变化。所以你想要它在 Swift 或 RxSwift 中? 【参考方案1】:为了观察您的 similarObjects 的变化,您必须使其类型为 Observable...
例如,您将similarObjects 声明如下:
var similarObjects: PublishSubject<[Objects]> = PublishSubject<[Objects]>()
您可以通过以下方式订阅它:
similarObjects
.asObservable()
.subscribe(onNext:
print($0)
而当你想给它赋值时,你可以使用onNext操作符
例子:
similarObjects.onNext(someArray)
调用 onNext 会执行 print($0) 语句,请确保在调用 onNext 之前订阅您的 Subject..
【讨论】:
【参考方案2】:可能内置的 didSet
解决方案是最好的,但是 rxswift 可以通过使用任何 *Subject
类型来处理这个问题。
例如,如果您选择PublishSubject
(开始为空并且只向订阅者发出新元素):
let similarObjectsSubject = PublishSubject<[Objects]>()
将值传递给主题:
similarObjectsSubject.onNext(similarObjects)
并在代码中的某处处理更改:
similarObjectsSubject.subscribe(onNext: objects in
// ...
)
【讨论】:
【参考方案3】:你可以通过将similarObjects作为中继来做到这一点,比如
//create a relay object for the array
let similarObjects: BehaviorRelay<[Objects]> = BehaviorRelay(value: [])
//subscribe to the chnages
_ = similarObjects.subscribe(onNext: (similarObjects) in
//you will get them here
, onError: (error) in
//error
, onCompleted:
//completed
)
//do something when disposed
//now when you set the array like this
similarObjects.accept(someArray)
【讨论】:
【参考方案4】:您可以使用BehaviorRelay
在对值进行操作(如添加、更新、删除)或将新值分配给数组时获取事件。
var similarObjects = BehaviorRelay<[Object]>(value: [])
similarObjects.subscribe(onNext: (array) in
print(array)
).disposed(by: disposeBag)
similarObjects.accept(someArray)
【讨论】:
Variable
在新版本的 RxSwift 中已弃用。以上是关于如何使用 RxSwift 订阅数组更改?的主要内容,如果未能解决你的问题,请参考以下文章