【问题标题】:RxSwift array of Variable with different types具有不同类型的变量的 RxSwift 数组
【发布时间】:2017-05-03 02:27:12
【问题描述】:

我正在尝试定义一个 Rxswift 变量数组,它具有不同的类型(Int、String、Bool、String?等...)

所以从技术上讲,我想要这样的东西,

var intVariable = Variable<Int>(10)
var stringVariable = Variable<String>("Hello, RxSwift")
let genericArray = [intVariable, stringVariable]

原因是,我有一个我想订阅的变量列表。

但是,我可以单独订阅变量,例如 intVariable.asObservable().subscribestringVariable.asObservable().subscribe 等。 但如果它在一个数组中,我可以遍历所有元素并订阅它。

Rxswift 变量定义为public final class Variable&lt;Element&gt;

P.S 我尝试过类型擦除,但没有运气。对此的任何帮助将不胜感激!

【问题讨论】:

  • 我怀疑这可能吗?什么情况下需要订阅不同类型的变量?
  • 我建议订阅一次合并的 observable 序列,而不是创建一个循环来订阅每个单独的 observable。由于您有不同类型的变量,您可以执行此处所述的解决方法stackoverflow.com/questions/39050059/…
  • 感谢@Nimble,非常适合我的情况。

标签: arrays swift generics rx-swift


【解决方案1】:

你在这里做什么完全取决于subscribe闭包的样子。如果您对任一变量中的每个项目都执行相同的操作,则无论类型如何,只需将它们都映射到相同的类型:

let bag = DisposeBag()
let intVariable = Variable<Int>(10)
let stringVariable = Variable<String>("Hello, RxSwift")
let genericArray = Observable.merge([intVariable.asObservable().map { "\($0)" }, stringVariable.asObservable()])
genericArray.subscribe(onNext: { print($0) }).disposed(by: bag)
intVariable.value = 5
stringVariable.value = "Goodby, RxSwift"

打印:

10
Hello, RxSwift
5
Goodby, RxSwift

如果您以某种方式组合这两个项目,您需要每个变量最近发出的信息,并且需要保留类型信息,请执行以下操作:

let genericArray = Observable.combineLatest(intVariable.asObservable(), stringVariable.asObservable())

打印:

(10, "Hello, RxSwift")
(5, "Hello, RxSwift")
(5, "Goodby, RxSwift")

如果您只想在 both 变量发出新元素时触发订阅,那么:

let genericArray = Observable.zip(intVariable.asObservable(), stringVariable.asObservable())

哪个打印:

(10, "Hello, RxSwift")
(5, "Goodby, RxSwift")

我会避免 (RxSwift merge different kind of Observables) 中提到的解决方案

【讨论】:

  • 感谢@Daniel T,我看到combineLatestzip 的问题是它仅限于8 个参数而不是通用的。我觉得第一个选项(合并)将是我的情况的最佳选择,原因是,我只需要监听更新并在任何更改上运行 invalidateLayout
  • 它们绝对是通用的。如果参数超过 8 个,则使用 combine of combine 或 zips of zips。
猜你喜欢
  • 2022-01-08
  • 2021-09-28
  • 2022-01-22
  • 1970-01-01
  • 2011-04-03
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多