如何将变量从可观察变量转换为其他可观察类型

问题描述 投票:1回答:1

我查询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)
            }
      }
}
android kotlin rx-java
1个回答
0
投票

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

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

object VideoRemoteSource: VideoDataSource {

override fun fetchVideos(playlistId: String, maxResults:String): Observable<ArrayList<YoutubeVideo>> {

    return YoutubeApiClient.getYoutubeService().getLatestVideosFromPlaylist(playlistId, maxResults)
    .flatMap(new Function<VideoModel, ObservableSource<YoutubeVideo>>() { 
        @Override
        public ObservableSource<UserDetail> apply(VideoModel videoModel) throws Exception {
            return arrayOf(videoModel.videos);
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.