如何使用RxSwift订阅数组更改?

问题描述 投票:0回答:4

我有一个简单的数组:

var similarObjects: [Objects] = []

我怎么能看到他的变化后:

similarObjects = someArray

我试试:(结果:下一个 - >完成)

_ = Observable.just(similarObjects)
     .subscribe({ event in
         return print(event.element)
     })
swift rx-swift
4个回答
1
投票

为了观察你的similarObjects的变化,你必须使它成为Observable类型......

例如,您声明类似对象如下:

var similarObjects: PublishSubject<[Objects]> = PublishSubject<[Objects]>()

您可以通过以下方式订阅它:

similarObjects
   .asObservable()
   .subscribe(onNext:{
         print($0)
   }

如果要为其分配值,可以使用onNext运算符

例:

similarObjects.onNext(someArray)

通过调用onNext,将执行print($ 0)语句,确保在调用onNext之前订阅你的Subject。


1
投票

你可以通过将类似对象作为中继来实现,比如

 //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) 

1
投票

可能内置的didSet解决方案是最好的,但是rxswift可以通过使用任何*Subject类型来处理这个问题。

例如,如果您选择PublishSubject(开始为空并且仅向订阅者发出新元素):

let similarObjectsSubject = PublishSubject<[Objects]>()

将价值传递给主题:

similarObjectsSubject.onNext(similarObjects)

并在代码中的某处处理更改:

similarObjectsSubject.subscribe(onNext: { objects in
     // ...
})

1
投票

您可以使用BehaviorRelay在操作值时获取事件,如添加,更新,删除或使用新值赋值给数组。

  var similarObjects = BehaviorRelay<[Object]>(value: [])

  similarObjects.subscribe(onNext: { (array) in
        print(array)
  }).disposed(by: disposeBag)

  similarObjects.accept(someArray)
© www.soinside.com 2019 - 2024. All rights reserved.