#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
, даже если источник не выдал ни одного элемента.