如何使用 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 订阅数组更改?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 RxSwift 中取消订阅 Observable?

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

如何使用 Moya RxSwift 合并 REST 数组

如何使用 rxswift 从数组中发出单个值?

RxSwift 共享订阅执行顺序