我一直在研究RxSwift,我在RxSwift中使用Variable
,它被挂钩(绑定到)UICollectionView
。现在知道Variable
从Behavior Subjects
延伸,我必须创建一个带有一些虚拟初始值的Variable
。
var myArray = Variable<[MyDataModel]>([MyDataModel(data: "{:}")])
MyDataModel
是一个以json
作为init参数的结构。(因为MyModel对此后的问题没有任何解释,而不是在这里发布它的结构)
现在,当我将它挂钩到collectionView时,我知道我应该忽略发出的第一个信号,所以我使用skip(1)
myArray.asObservable().skip(1).bind(to: collectionView.rx.items(cellIdentifier: "test", cellType: MyCollectionViewCell.self){
//cell implementation
})
虽然上面的代码有效,但它可以部分地解决问题。虽然value
myArray
中的第一个更改被忽略,但是当我稍后使用
myArray
时
myArray.value.append(someNewData)
它会发出通知,不幸的是,这次myArray.value
有两个值(我在初始化时添加的虚拟值和实际触发的onNext
)
因此,作为一种解决方法,我做的是盲目地将数据附加到myArray.value
之前我检查它是否有我添加的虚拟对象,如果是,我将其删除并添加实际对象。
虽然可以解决问题,但是我的代码在某种程度上看起来非常丑陋且非Rx。我认为必须有一个正确的方法来处理它,因为这是使用Variable
的一个非常基本的问题。
我真的很感激你的想法。
答案 0 :(得分:5)
首先,在RxSwift 4.x中不推荐使用 Variable ,而采用 BehaviorRelay 。
但是出于您的目的, PublishSubject 或 BehaviorSubject (如果您需要缓存最新值)应该足够了。