【发布时间】:2017-04-16 15:20:00
【问题描述】:
首先,我是 rxswift 的新手,所以我想答案很明显,但是目前我自己找不到解决方案。
我有两个功能:
func downloadAllTasks() -> Observable<[Task]>
func getTaskDetails(taskId: Int64) -> Observable<TaskDetails>
第一个是使用网络请求下载任务对象列表,第二个是下载特定任务的任务详细信息(使用它的 id)
我想要实现的是下载所有任务,然后对于每个任务我想下载其详细信息并订阅所有任务详细信息准备就绪时触发的事件。
所以我想我应该以某种方式订阅 Observable 但我不知道该怎么做。
downloadAllTasks()
.flatMap{
... // flatMap? something else?
}
.subscribe(
onNext: { details in
print("tasks details: \(details.map{$0.name})")
})
.addDisposableTo(disposeBag)
//编辑
感谢 Silvan 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 个任务可用,因此您可以确保所有任务都已正确下载,但由于某种原因,一旦所有任务详细信息都准备好,toArray() - (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()
}
}
【问题讨论】: