我查询youtube api,并制作了多个模型来使用gson转换器映射json。现在,我想使用存储库模式并统一数据库和远程数据库的返回值,但是我有一些问题需要知道如何从RxJava中的可观察对象返回特定变量。
我这样查询api:
@GET("playlistItems?part=snippet")
fun getLatestVideosFromPlaylist(@Query("playlistId") playlistId:String, @Query("maxResults") maxResults:String): Observable<YoutubeVideosModel>
我的模特
data class YoutubeVideosModel(
@SerializedName("items")
val videos: ArrayList<YoutubeVideo>
)
@Entity(tableName = "video")
data class YoutubeVideo(
@PrimaryKey(autoGenerate = true)
val id: Int? = null,
@SerializedName("snippet")
val video: YoutubeVideoData
)
我的数据源界面
interface VideoDataSource {
fun fetchVideos(playlistId:String) : Observable<ArrayList<YoutubeVideo>>
}
从本地数据源返回youtubeVideo的arrayList
object VideoLocalSource: VideoDataSource {
override fun fetchVideos(playlistId: String): Observable<ArrayList<YoutubeVideo>> {
return Observable.fromCallable {
AppDatabase.getInstance(BaseApp.INSTANCE)?.getVideoDao()!!.fetchAllVideos()
}
}
}
但是从我的遥控器上我找不到如何返回相同的内容:
object VideoRemoteSource: VideoDataSource {
override fun fetchVideos(playlistId: String, maxResults:String): Observable<ArrayList<YoutubeVideo>> {
YoutubeApiClient.getYoutubeService().getLatestVideosFromPlaylist(playlistId, maxResults)
.subscribe {
videoModel ->
//Here cannot use return
return ObservableFromArray(arrayOf(videoModel.videos)
}
}
}
答案 0 :(得分:1)
您遇到的困难是异步编程要求您思考的方式。在订阅回调内部返回observable无效。因为您不知道何时会呼叫该订阅者
对于这种情况,如果您想返回异步获取的可观察对象,则可以使用下面的映射。
object VideoRemoteSource: VideoDataSource {
override fun fetchVideos(playlistId: String): Observable<List<YoutubeVideo>> {
return youtubeApiService.getLatestVideosFromPlaylist(playlistId, "3")
.flatMap{
Observable.fromArray(it.videos)
}
}
}