从 RxSwift4 开始,Variable
已移至 Deprecated.swift
,标志着将来可能弃用 Variable
。建议使用 Variable
的替代方案是 BehaviorRelay
。在发布这个问题时,由于我在网络上找不到太多使用 BehaviorRelay
的教程,所以我在 SO 中发布了这样一个基本问题。
假设我正在进行 webService 调用,并且收到一大块 JSONArray 数据,在逐个解析 JSON 对象时,我会更新变量的 value 属性
这是我的变量声明
var myFilter = Variable<[MyFilterModel]>([MyFilterModel(data: "{:}")])
每次我将变量更新为时都会获得一个新元素
myFilter.value.append(newModel)
由于 Variable 绑定(bind)到 CollectionView,collectionVie 会立即使用新添加的对象更新其 UI。
BehaviorRelay 问题
现在我的声明看起来像
var myFilter = BehaviorRelay<[MyFilterModel]>(value: [MyFilterModel(data: "{:}")])
但最大的问题是 myFilter.value
是只读。很明显
myFilter.value.append(newModel)
不是一个解决方案。我发现我可以使用 accept
来代替。
但是现在当我尝试解析响应中的每个元素并更新 myFilter 的值
self?.expertsFilter.accept(newModel)
上面的语句引用错误
Can not convert the value of NewModel to expected arguement type [NewModel]
显然,它需要一个数组而不是单个元素。
解决方法:
解决方案 1:
因此,一种解决方案是将所有响应累积在临时数组中,完成后触发 self?.expertsFilter.accept(temporary_array)
解决方案 2:
如果我必须在解析每个元素时向订阅者发送 onNext
事件,我需要将 self?.expertsFilter 的值复制到新数组,将新解析的元素添加到其中并返回新的数组。
解决方案 3:
摆脱BehaviorRelay
并使用BehaviorSubject
/PublishSubject
前两个听起来令人沮丧,因为可能需要在解析每个元素时触发 UI,我等不及解析整个响应。所以显然解决方案1没有多大用处。
第二个解决方案更可怕,因为它每次发送 onNext 事件时都会创建一个新数组(我知道它是临时的并且将被释放)。
问题:
因为 BehaviorRelay
被提议作为 Variable
的替代方案,所以我陷入了困境,我是否正确使用了 accept
?有没有更好的方法来解决呢?
请帮忙
最佳答案
您是否考虑过简单地根据中继上的现有值创建一个新数组,追加,然后调用 accept
?
myFilter.accept(myFilter.value + [newModel])
关于rx-swift - 如何使用BehaviorRelay作为RxSwift中变量的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452582/