如何使用BehaviorRelay作为RxSwift中变量的替代品?

2024-01-19

从 RxSwift4 开始,Variable被移至Deprecated.swift标记可能的弃用Variable在未来。提议的替代方案Variable is BehaviorRelay。在发布这个问题时,因为我在网上找不到很多教程BehaviorRelay我在这里发布了这样一个基本问题。

假设我正在进行 webService 调用,并且收到一大块 JSONArray 数据,在逐一解析 JSON 对象时,我更新了变量的 value 属性

这是我的变量声明

var myFilter = Variable<[MyFilterModel]>([MyFilterModel(data: "{:}")])

每次获取新元素时我都会将变量更新为

myFilter.value.append(newModel)

由于 Variable 绑定到 CollectionView,collectionVie 将立即使用新添加的对象更新其 UI。

BehaviourRelay 的问题

现在我的声明看起来像

var myFilter = BehaviorRelay<[MyFilterModel]>(value: [MyFilterModel(data: "{:}")])

但最大的问题是myFilter.value is readOnly。很明显

myFilter.value.append(newModel) 

不是一个解决方案。我发现我可以使用accept rather.

但现在当我尝试解析响应中的每个元素并更新 myFilter 的值时

self?.expertsFilter.accept(newModel)

上面的语句引用错误

无法将 NewModel 的值转换为预期的参数类型 [新模型]

显然,它需要一个数组而不是单个元素。

解决方法:

解决方案一:

因此,一种解决方案是将所有响应累积在临时数组中,并在完成后触发self?.expertsFilter.accept(temporary_array)

解决方案2:

如果我必须发送onNext在解析每个元素时发送给订阅者的事件,我需要将 self?.expertsFilter 的值复制到新数组,将新解析的元素添加到其中并返回新数组。

解决方案3:

摆脱BehaviorRelay并使用BehaviorSubject/PublishSubject

前两个听起来令人沮丧,因为可能需要在解析每个元素时触发 UI,我等不及解析整个响应。所以显然解决方案1没有多大用处。

第二个解决方案更可怕,因为它每次发送 onNext 事件时都会创建一个新数组(我知道它是临时的并且将被释放)。

问题:

Because BehaviorRelay建议作为替代方案Variable我陷入困境,正在使用accept正确吗??有没有更好的方法来解决呢?

请帮忙


您是否考虑过简单地从继电器上的现有值创建一个新数组,附加,然后调用accept?

myFilter.accept(myFilter.value + [newModel])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用BehaviorRelay作为RxSwift中变量的替代品? 的相关文章

随机推荐