使用 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 并更新一个名为 tmdbMovie
的 TraktMovie
属性,嵌套请求值类型为 TMDbMovie
也在 Realm 中。
我的意思是:
- 首先,我需要在我的
[TraktMovie]
数组中循环以将它的每个值保存在 Realm 中(比如一个名为 traktMovie
的对象)
for traktMovie in traktMovies {
let realm = try! Realm()
realm.write {
realm.add(traktMovie)
}
}
其次,我需要通过第二个请求(例如 getDetails(_ , _)
)检索每个 TraktMovie
对象的详细信息:使用类似 flatMap
的内容?
第三,我需要按照 getDetails
请求检索到的值更新每个 traktMovie
对象 属性(比如 tmdbMovie
检索到的值):
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 发出一个值。
假设我有 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 并更新一个名为 tmdbMovie
的 TraktMovie
属性,嵌套请求值类型为 TMDbMovie
也在 Realm 中。
我的意思是:
- 首先,我需要在我的
[TraktMovie]
数组中循环以将它的每个值保存在 Realm 中(比如一个名为traktMovie
的对象)
for traktMovie in traktMovies {
let realm = try! Realm()
realm.write {
realm.add(traktMovie)
}
}
其次,我需要通过第二个请求(例如
getDetails(_ , _)
)检索每个TraktMovie
对象的详细信息:使用类似flatMap
的内容?第三,我需要按照
getDetails
请求检索到的值更新每个traktMovie
对象 属性(比如tmdbMovie
检索到的值):
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 发出一个值。