Этот Observable выполняет следующие
- Учитывая наблюдаемый источник
- мы используем карту для выполнения некоторой асинхронной работы
- мы используем concat, чтобы вернуть результат асинхронной работы, чтобы
Следующее возвращает желаемый результат, но я хотел бы начать асинхронную работу параллельно.
Какой правильный способ сделать это с Rx?
import RxSwift
func delay(time: Int, closure: () -> Void) {
dispatch_after(
dispatch_time(DISPATCH_TIME_NOW, Int64(time * Int(NSEC_PER_SEC))),
dispatch_get_main_queue(), closure)
}
func doAsyncWork(value: Int, desc: String, time: Int) -> Observable<Int> {
return Observable.create() { (observer) -> Disposable in
print(desc)
delay(time) {
observer.onNext(value)
observer.onCompleted()
}
return NopDisposable.instance
}
}
let seq = Observable
.of(1, 2, 3, 4, 5)
.map { (n) -> Observable<Int> in
return doAsyncWork(n,
desc: "start \(n) - wait \(5 - n)",
time: 6 - n
)
}
.concat()
let sharedSeq = seq.shareReplay(0)
sharedSeq.subscribeNext { print("=> \($0)") }
sharedSeq.subscribeCompleted { print("=> completed") }
Эта продукция
//start 1 - wait 4
// => 1
//start 2 - wait 3
// => 2
//start 3 - wait 2
// => 3
//start 4 - wait 1
// => 4
//start 5 - wait 0
// => 5
Желаемый результат будет
//start 1 - wait 4
//start 2 - wait 3
//start 3 - wait 2
//start 4 - wait 1
//start 5 - wait 0
// => 1
// => 2
// => 3
// => 4
// => 5
Observable
s параллельно, но ваш желаемый результат, похоже, не согласуется. Если все они запускаются без задержки, то не должен ли порядок быть5, 4, 3, 2, 1
, поскольку5
ждет 0 секунд, а4
ждет 1 секунду и т. Д.? - person solidcell   schedule 12.06.2016swift
, ваш вопрос и ответы будут выделены синтаксисом. - person solidcell   schedule 12.06.2016