从 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
正确吗??有没有更好的方法来解决呢?
请帮忙