Как мне объединить наблюдаемые результаты цикла в массив в RxSwift?

#rx-swift #reactive #rx-cocoa

#rx-swift #реактивный #rx-cocoa

Вопрос:

У меня есть простой поток, содержащий числа. Я хочу выполнить некоторые математические операции, а затем последовательно собрать результаты в массив. Как я могу это сделать?

 func test (number : Int) -> Observable<Int> {
        let obs2 = Observable<Int>.create { (obs) -> Disposable in
            obs.onNext(number   10)
            return Disposables.create()
        }

        return obs2
    }

let obs = Observable.from([1,2,3,4]).flatMap { (item) -> Observable<Int> in
            self.test(number: item)
            }.map { (result) -> Int in
                return result
            }

//I want this: 
obs.subscribe(onNext : {[Int] in 
     ...
     ...
}
  

Я не могу объединить каждый int в массив.

Ответ №1:

 let arrayObservable = obs.reduce([]) { acc, element in acc   [element] }
  

Reduce начнется с пустого массива и добавит каждый элемент потока в массив. Затем после завершения работы источника .next будет выдано только одно obs событие с результатом накопления.


Другим вариантом было бы использовать buffer оператор. Но имейте в виду, что результирующий массив будет содержать только определенное количество элементов и что он также будет выдавать каждый timeSpan , даже если источник не выдал ни одного элемента.