如何将 return 变量从可观察到另一种可观察类型

How to return variable from observable into another observable type

我查询了 youtube api 并制作了几个模型来映射 json 与 gson 转换器。现在我想使用存储库模式并统一来自我的数据库和远程的 return 值,但是我有一些问题想知道如何 return 来自 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>>
}

从我的本地数据源我 return youtubeVideo 的 arrayList

object VideoLocalSource: VideoDataSource {

override fun fetchVideos(playlistId: String): Observable<ArrayList<YoutubeVideo>> {
    return Observable.fromCallable {
        AppDatabase.getInstance(BaseApp.INSTANCE)?.getVideoDao()!!.fetchAllVideos()
    }
  }
}

但是从我的遥控器上我找不到如何return相同的:

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)
            }
      }
}

您遇到困难的是异步编程需要您思考的方式。在订阅回调中返回一个可观察对象是无效的。因为你不知道订阅者什么时候会被叫到

对于这种情况,如果您想 return 观察到您正在异步获取的内容,您可以使用如下图。

object VideoRemoteSource: VideoDataSource {

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

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

}