假设我有两个不同Observable
返回类型的函数:
func getWatchedMovies() -> Observable<[TraktMovie]>
func getDetails(id: Int, language: String) - > Observable<TMDbMovie>
我想在我的getWatchedMovies()
请求中平面映射每个值,以便能够像这样请求每部电影的详细信息(我不确定这是最好的方法,但是......)
traktDataManager?
.getWatchedMovies()
.flatMap({ (traktMovies) -> Observable<[TraktMovie]> in
let moviesObs = Observable.from(traktMovies)
let movieDetails = moviesObs.flatMap {
self.tmdbDataManager!.getMovieDetails(id: $0.ids.tmdb, language: Device.lang)
}
})
问题是,我需要将每个TraktMovie
添加到Realm并使用Realm中类型为TraktMovie
的嵌套请求值更新名为tmdbMovie
的{{1}}属性太
我的意思是:
TMDbMovie
数组中循环以在Realm中保存它的每个值(比如一个名为[TraktMovie]
的对象)traktMovie
第二,我需要使用第二个请求(例如for traktMovie in traktMovies {
let realm = try! Realm()
realm.write {
realm.add(traktMovie)
}
}
)检索每个TraktMovie
对象的详细信息:类似getDetails(_ , _)
?
第三,我需要更新每个flatMap
对象属性,如下所示,使用traktMovie
请求检索的值(对于检索到的值,请说getDetails
):
tmdbMovie
这里我从第一个名为traktMovie.setValue(tmdbMovie, forKeyPath: "tmdbMovie")
的请求(getWatchedMovies()
)中检索到一个对象,并使用从第二个请求中检索到的对象更新其名为traktMovie
的属性之一({{ 1}})也命名为tmdbMovie
事情是我的第一个请求返回一个数组而第二个只返回一个对象。
如果我返回getDetails(_, _)
对象,我只得到一个带有tmdbMovie
事件的对象,而我松开了TMDbMovie
数组。
希望我足够清楚。
非常感谢帮助!
答案 0 :(得分:0)
您可以尝试使用Observable.zip,如下例所示:
getWatchedMovies()
.flatMap({ [unowned self] (traktMovies) -> Observable<[TraktMovie]> in
let movieDetails = traktMovies.flatMap { movie in
// you can save in realm here
return Observable.just(movie)
.withLatestFrom(self.getMovieDetails(id: 0, language: "")) { movie, details in
// here you have both movie & movieDetails
return movie
}
}
return Observable.zip(movieDetails, { return $0 })
})
如果 getMovieDetails 中的一个失败将导致整个流失败,并且它将要求所有 getMovieDetails 发出onNext事件,这可能有点危险。 zipped Observable发出一个值。