如何在 RxSwift 中将值附加到观察到的数组

Posted

技术标签:

【中文标题】如何在 RxSwift 中将值附加到观察到的数组【英文标题】:How do I append values fo an observed array in RxSwift 【发布时间】:2020-01-03 08:59:16 【问题描述】:

试图抓住RxSwift 并在一些事情上陷入困境。

var observedData = BehaviorSubject.from([2, 3, 4, 5, 6])
    .map($0*3).subscribe(onNext: 
        print("HELLO", $0)
    )

我如何append给数组一个额外的值,以便再次触发subscription

我尝试了observedData.onNextobservedData.accept,但它们不起作用。

我也想知道两者的区别

var observedData = BehaviorSubject.from([2, 3, 4, 5, 6])

var observedData2 = BehaviorSubject<[Int]>(value: [2, 3, 4, 5, 6])

我最初认为这是写同一件事的不同方式,但我不能在 observedData2 上使用 .map

【问题讨论】:

也许你需要像***.com/questions/44832750/…这样的东西 【参考方案1】:

连同@EtienneJézéquel 给出的答案......

public static func ObservableType.from(_:) 函数返回一个 Observable,而 BehaviorSubject.init(value:) 创建一个 BehaviorSubject,然后必须先将其转换为 Observable,然后才能map(_:) 它。

此外,当您意识到您没有附加到 BehaviorSubject 包含的数组,而是使用它发出一个 new 数组时,这可能有助于更好地理解。这就是为什么 Etienne 的代码首先使用 value() throws 将当前数组复制出主题并附加到副本,然后使用 onNext(_:) 将新数组推送到主题中。

最后,不要将主题设为vars,它们应始终为lets,因为您不想在为它们设置链后重新安装它们。

【讨论】:

【参考方案2】:

类似的东西应该可以工作:

let subject = BehaviorSubject<[Int]>(value: [2, 3, 4, 5, 6])
subject.asObservable().map($0.map($0*3)).subscribe(onNext:  print("HELLO", $0) ).disposed(by: disposeBag)
if var value = try? subject.value() 
    value.append(1)
    subject.on(.next(value))

【讨论】:

以上是关于如何在 RxSwift 中将值附加到观察到的数组的主要内容,如果未能解决你的问题,请参考以下文章

在 ViewController 中可观察到的单元测试 RxSwift

如何在 Objective-C 中将值附加到数组

如何从 foreach 循环中将双精度值附加到 2D 数组,并访问前一个索引?

RxSwift - 来自可观察到的忽略错误的驱动程序

如何使用 rxswift 从数组中发出单个值?

在 Swift 中将项目添加到 Firebase 数组而不首先观察数组