冷杉的整個我是新的rxswift所以我想答案是顯而易見的,但目前我無法自己找到解決方案。正確使用RxSwift來鏈接請求,flatMap或其他東西?
我有兩個功能:
func downloadAllTasks() -> Observable<[Task]>
func getTaskDetails(taskId: Int64) -> Observable<TaskDetails>
第一種是下載任務列表中使用網絡的請求對象,第二個下載的sepcific任務的任務詳細信息(使用它的id)
我想要的是什麼實現是下載所有任務,然後爲每個任務我想下載其詳細信息,並訂閱所有任務詳細信息準備就緒的事件。
所以我想我應該訂閱某種方式Observable < [TaskDetails]>但我不知道該怎麼做。
downloadAllTasks()
.flatMap{
... // flatMap? something else?
}
.subscribe(
onNext: { details in
print("tasks details: \(details.map{$0.name})")
})
.addDisposableTo(disposeBag)
//編輯
由於西爾Mosberger答案我更接近的解決方案。還有一個問題。現在,我有這樣的事情:
downloadAllTasks()
.flatMap{ Observable.from($0) }
.map{ $0.id }
.flatMap{ [unowned self] id in
self.getTaskDetails(taskId: id).catchError{ error in
print("$$$ Error downloading task \(id)")
return .empty()
}
}
.do(onNext: { _ in
print(" $$$ single task details downloaded")
})
.toArray()
.debug("$$$ task details array debug", trimOutput: false)
.subscribe({ _ in
print("$$$ all tasks downloaded")
})
.addDisposableTo(disposeBag)
輸出是
$$$ task details array debug -> subscribed
$$$ single task details downloaded
$$$ single task details downloaded
$$$ single task details downloaded
有3個任務,所以你可以SE所有的人都正確但下載出於某種原因指定者的結果中提供() - (Observable<[TaskDetails]>
)在所有任務細節準備好後都不會生成「onNext」。
//編輯再次
好吧,我加入的提供可觀的功能簡化版本,也許這將有助於東西
func downloadAllTasks() -> Observable<Task> {
return Observable.create { observer in
//... network request to download tasks
//...
for task in tasks {
observer.onNext(task)
}
observer.onCompleted()
return Disposables.create()
}
}
func getTaskDetails(id: Int64) -> Observable<TaskDetails> {
return Observable.create { observer in
//... network request to download task details
//...
observer.onNext(taskDetails)
return Disposables.create()
}
}
尼斯和清潔的解釋,非常感謝。它幾乎可以按我的需要工作。幾乎,因爲我有問題與最後部分 - toArray()。如果沒有這部分,用戶將得到有關任務細節下載事件的正確通知使用toArray時,我希望在下載所有任務細節時,我會在訂閱者的onNext中收到通知,但onNext根本不會被調用。你看到什麼可能是一個問題? – Wujo
@Wujo當單個任務細節下載遇到錯誤時,最終的'Observable'將出錯。你應該可以在'.toArray()'之前用'.debug()'來檢查。我編輯了我的答案,如果你想要它完成,即使有錯誤 –
getTaskDetails期間的問題沒有出錯,所有的任務細節都正確下載。我編輯了我原來的帖子,試圖更清楚地指出它。 – Wujo