如何在 RxSwift 中消除变量的初始值

5

我一直在研究RxSwift,我正在使用RxSwift中的Variable,并将其与UICollectionView绑定。现在知道Variable是从Behavior Subjects扩展而来的,所以我不得不创建一个带有一些虚拟初始值的Variable

 var myArray = Variable<[MyDataModel]>([MyDataModel(data: "{:}")])

MyDataModel 是一个结构体,它以 json 作为初始化参数。(由于 MyModel 与接下来的问题无关,因此我在此不会发布其结构)

现在,当我将其连接到 collectionView 时,我知道应该忽略发出的第一个信号,因此我使用 skip(1)

myArray.asObservable().skip(1).bind(to: collectionView.rx.items(cellIdentifier: "test", cellType: MyCollectionViewCell.self){
        //cell implementation    
})

虽然上面的代码可以工作,但只是部分解决了问题。尽管 myArrayvalue 的第一个更改被忽略了,但当我稍后使用以下代码将实际数据附加到 myArray 时:

myArray.value.append(someNewData)

这段代码会发出通知,但不幸的是,这次 myArray.value 有两个值(一个是我初始化时添加的虚拟值,另一个是实际触发 onNext 的值)。

所以,作为解决方法,在将数据盲目追加到myArray.value之前,我会检查它是否有我添加的虚拟对象,如果是,我会将其删除并添加实际对象。

虽然这种解决方法有效,但使我的代码看起来非常丑陋,而且在某种程度上与Rx无关。我相信在使用Variable时应该有更好的解决方法,因为这是一个非常基本的问题。

我非常感谢您对此的想法。

1个回答

6

首先,RxSwift 4.x 中已弃用 Variable,建议使用 BehaviorRelay

但是根据您的需求,PublishSubject 或者 BehaviorSubject(如果需要缓存最新值)应该就足够了。


我正在使用RxSwift 4.0,但我没有看到Variable的任何弃用警告,我也检查了源代码,没有添加任何弃用。你确定Variable在RxSwift4中已经被弃用了吗?其次,我不能使用Publish和Behaviour subjects,因为两者都可以通过错误或完成事件终止。但从概念上讲,它是绑定到collectionView数据源的变量,不能以错误结束或具有完成状态。我知道我可以使用asDriver()与Publish/Behavior,但认为Variable本身就是为这个原因而设计的。 - Sandeep Bhandari
请查看 https://github.com/ReactiveX/RxSwift/releases/tag/4.0.0-rc.0 中的最后一个项目。 - Maxim Volgin
关于错误/完成 - 这取决于您如何将数据放入主题中,如果您只调用*.onNext(),那么您是安全的。如果这是一系列服务调用,则我更愿意将请求放入可观察的主题中,并将.switchLatestDelayError()*绑定到UI。 - Maxim Volgin
我正在使用RxSwift4,但无法访问BehaviorRelay,你用的是哪个Rxversion?顺便说一下,我提出了一个问题https://github.com/ReactiveX/RxSwift/issues/1501 - Sandeep Bhandari
4.0.0; 这是它的链接 - https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/Traits/BehaviorRelay.swift - Maxim Volgin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接