如何摆脱RxSwift中Variable的初始值

时间:2017-11-23 06:37:28

标签: ios rx-swift

我一直在研究RxSwift,我在RxSwift中使用Variable,它被挂钩(绑定到)UICollectionView。现在知道VariableBehavior 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的一个非常基本的问题。

我真的很感激你的想法。

1 个答案:

答案 0 :(得分:5)

首先,在RxSwift 4.x中不推荐使用 Variable ,而采用 BehaviorRelay

但是出于您的目的, PublishSubject BehaviorSubject (如果您需要缓存最新值)应该足够了。