使用 Realm add() / setValue() 的链式 RxSwift 请求

Chained RxSwift request with Realm add() / setValue()

假设我有 2 个函数,有 2 个不同的 Observable return 类型:

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: [=11=].ids.tmdb, language: Device.lang) 
    }
  })

问题是,我需要将每个 TraktMovie 添加到 Realm 并更新一个名为 tmdbMovieTraktMovie 属性,嵌套请求值类型为 TMDbMovie 也在 Realm 中。

我的意思是:

for traktMovie in traktMovies {
  let realm = try! Realm()
  realm.write {
    realm.add(traktMovie)
  }  
}
traktMovie.setValue(tmdbMovie, forKeyPath: "tmdbMovie")

这里我有一个从第一个请求 (getWatchedMovies()) 中检索到的名为 traktMovie 的对象,我用从中检索到的对象更新了其中一个名为 tmdbMovie 的 属性第二个请求 (getDetails(_, _)) 也命名为 tmdbMovie

我的第一个请求是 return 一个数组,第二个请求只是一个对象。

如果我 return TMDbMovie 对象,我只有一个带有 onNext 事件的对象并且我丢失了我的 [TraktMovie] 数组。

希望我说得够清楚了。

非常感谢您的帮助!

您可以尝试使用 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 [=10=] })
        })

这可能有点冒险,如果 getMovieDetails 之一失败,整个流都会失败,同时它需要所有 getMovieDetails 发出 onNext 事件,以便压缩 Observable 发出一个值。