如何将变量从可观察值返回到另一种可观察类型

时间:2020-03-20 09:06:59

标签: android asynchronous kotlin rx-java

我查询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)
            }
      }
}

1 个答案:

答案 0 :(得分:1)

您遇到的困难是异步编程要求您思考的方式。在订阅回调内部返回observable无效。因为您不知道何时会呼叫该订阅者

对于这种情况,如果您想返回异步获取的可观察对象,则可以使用下面的映射。

object VideoRemoteSource: VideoDataSource {

override fun fetchVideos(playlistId: String): Observable<List<YoutubeVideo>> {

    return youtubeApiService.getLatestVideosFromPlaylist(playlistId, "3")
            .flatMap{
                Observable.fromArray(it.videos)
            }
    }

}