我在重新开始的世界里很新,现在我遇到了一个问题:
我有两个返回observables的函数:
func connect() -> Observable<Connection>
和
func execute(_ statement: Statement) -> Observable<Result>
我现在需要做的是,connect
必须在execute
之前运行,然后我必须返回execute
的结果......
我认为我要做的是在execute
返回的{obstable}的map
函数内运行connect
函数,如下所示:
public func executeFetch(_ query: Statement) -> Observable<Result> {
return self.connect()
.map({ (connection) -> Result in
return execute(query) // here is my problem because execute returns an Observable<Result>.
})
}
但由于execute
返回Observable<Result>
,我会收到Observable<Observable<Result>>
我该如何解决这个问题?
答案 0 :(得分:1)
而不是map
,请尝试使用flatMap
。 flatMap
允许您将之前的结果链接到另一个Observable,而map
更多地是对值的直接转换(例如,将Observable<A>
转换为Observable<B>
。
在map
内执行大量同步工作没有任何问题,特别是如果您使用Scheduler
来确保在适当的线程上完成该工作(例如{{1} }}),但是如果你试图将第二个Observable编织到你的链中,那么.subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
将是惯用的方法。