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

标签 rx-swift

从 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/

相关文章:

swift - 如何使用 RxSwift 和 Alamofire 进行分页?

swift - 设计可观察对象

ios - RxSwift - 订阅一个方法

swift - 我应该从哪里在整洁的架构中呈现 MFMailComposeViewController?

ios - RxSwift 教程示例 : Attribute can only be applied to types, 不是声明

ios - 处理 UITableView 绑定(bind)中的连接错误(Moya、RxSwift、RxCocoa)

ios - RxSwift 订阅将在启动时工作

ios - 如何将 UIButton.isSelectable 与 RXSwift 绑定(bind)

ios - RxSwift - 自动重新加载使用 Observable 初始化的 UITableView

memory - 在 RxSwift 闭包上使用 'self' ...实例方法作为参数怎么样?