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

时间:2018-04-10 10:50:10

标签: swift realm observable rx-swift flatmap

假设我有两个不同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数组。

希望我足够清楚。

非常感谢帮助!

1 个答案:

答案 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发出一个值。