這可觀察正在執行以下Rxswift地圖+ CONCAT並行
- 鑑於觀察到的源
- 我們用地圖來執行一些異步工作
- 我們使用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秒等等。 – solidcell
如果你更新你的文章以包含一個'swift'標籤,你的問題和答案將得到語法高亮顯示。 – solidcell
對不起@solidcell這個問題非常模糊,我現在希望更清楚地編輯它。我的目標是按順序返回異步工作的結果,但要同時開始每個異步工作。如果保持順序無關緊要,那麼使用你所建議的flatmap可以完美地工作 – Pierre