swift - Rxswift map + concat in parallel -
this observable executing following
- given source observable
- we use map perform async work
- we use concat return result of async work in order
the following returning desired result, start async work in parallel.
what correct way of doing 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") }
this produce
//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
the desired output be
//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
this seems work not sure best answer though
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 let o = doasyncwork(n, desc: "start \(n) - wait \(5 - n)", time: 6 - n ).sharereplay(1) o.subscribe() return o.asobservable() } .concat() let sharedseq = seq.sharereplay(0) sharedseq.subscribenext { print("=> \($0)") } sharedseq.subscribecompleted { print("=> completed") }
Comments
Post a Comment