RxSwift-如何连接集合的可观察对象

时间:2018-10-13 16:15:44

标签: swift reactive-programming rx-swift

我正在尝试使用concat()运算符将集合的两个可观察值连接起来,但是,它不能按预期工作。

我有两个观察对象:

let first = Observable<[Int]>.create { observer in
    observer.onNext([1, 2])
    observer.onCompleted()
    return Disposables.create()
}

let second = PublishSubject<[Int]>()

使用concat()

let items = Observable.concat([first, second])

items.subscribe(onNext: {
    print($0)
})

second.onNext([3, 4, 5])

输出:

[1, 2]
[3, 4, 5]

我想要什么:

[1, 2]
[1, 2, 3, 4, 5]

1 个答案:

答案 0 :(得分:1)

因此,您只是不想合并两个可观察变量,而您不希望合并两个观察变量产生的事件中的数组。您还远远没有得到想要的东西。

想象一下,您有两个Array <[Int]>而不是两个Observable <[Int]>。合并两个(如arr1 + arr2)不会产生[[1, 2], [1, 2, 3, 4, 5]],而是会产生[[1,2],[3,4,5]]。您的可观察对象的行为方式相同。

要同时合并,您需要scan,如下所示:

let items = Observable.concat([first, second])
    .scan([], accumulator: +)

这将产生两个事件:

[1, 2]
[1, 2, 3, 4, 5]

仅供参考,对于数组,我们没有扫描运算符,但可以使用reduce对其进行近似。对于数组,它将是:

let arr1: Array<[Int]> = [[1, 2]]
let arr2: Array<[Int]> = [[3, 4, 5]]
let itemsArr = (arr1 + arr2).reduce([], { result, element in
    return result + [(result.last ?? []) + element]
})
print(itemsArr)