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

Popular posts from this blog

wordpress - (T_ENDFOREACH) php error -

Export Excel workseet into txt file using vba - (text and numbers with formulas) -

Using django-mptt to get only the categories that have items -