RXSwift 一个可观察对象的第一个元素在另一个可观察对象的结果之后
RXSwift first element of one observable after result of other observable
我是反应世界的新手,现在我遇到了一个问题:
我有两个函数 returns observables:
func connect() -> Observable<Connection>
和
func execute(_ statement: Statement) -> Observable<Result>
我现在需要做的是,connect
必须在 execute
之前 运行 然后我必须 return execute
的结果...
我想我要做的是 运行 由 connect
编辑的可观察 return 函数的 map
函数内部的 execute
函数,像这样:
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
return 一个 Observable<Result>
我得到一个 Observable<Observable<Result>>
我该如何解决这个问题?
尝试使用 flatMap
而不是 map
。 flatMap
允许您将之前的结果链接到另一个 Observable,而 map
更像是值的直接转换(例如,将 Observable<A>
变成 Observable<B>
。
在 map
中执行大量同步工作没有错,特别是如果您使用 Scheduler
来确保在适当的线程上完成工作(例如 .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
), 但是如果你试图将第二个 Observable 编织到你的链中,那么 flatMap
将是惯用的方法。
我是反应世界的新手,现在我遇到了一个问题:
我有两个函数 returns observables:
func connect() -> Observable<Connection>
和
func execute(_ statement: Statement) -> Observable<Result>
我现在需要做的是,connect
必须在 execute
之前 运行 然后我必须 return execute
的结果...
我想我要做的是 运行 由 connect
编辑的可观察 return 函数的 map
函数内部的 execute
函数,像这样:
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
return 一个 Observable<Result>
我得到一个 Observable<Observable<Result>>
我该如何解决这个问题?
尝试使用 flatMap
而不是 map
。 flatMap
允许您将之前的结果链接到另一个 Observable,而 map
更像是值的直接转换(例如,将 Observable<A>
变成 Observable<B>
。
在 map
中执行大量同步工作没有错,特别是如果您使用 Scheduler
来确保在适当的线程上完成工作(例如 .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
), 但是如果你试图将第二个 Observable 编织到你的链中,那么 flatMap
将是惯用的方法。