【问题标题】:How to subscribe on array changes using RxSwift?如何使用 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 中?

标签: swift rx-swift


【解决方案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 中已弃用。
        猜你喜欢
        • 2021-12-05
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多