Как вернуть переменную из наблюдаемого в другой наблюдаемый тип - PullRequest
2 голосов
/ 20 марта 2020

Я запросил API YouTube и сделал несколько моделей для сопоставления json с конвертером gson. Теперь я хочу использовать шаблон репозитория и унифицировать возвращаемое значение из моей базы данных и из удаленной системы, но у меня есть некоторые проблемы, связанные с тем, как вернуть указанную переменную c из наблюдаемой в Rx Java.

Я запрашиваю 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>>
}

Из локального источника данных я возвращаю arrayList из youtubeVideo

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 Ответ

1 голос
/ 20 марта 2020

С чем вы сталкиваетесь, так это с тем, как асинхронное программирование заставляет вас думать. Возврат наблюдаемого внутри обратного вызова подписки недопустим. Поскольку вы не знаете, когда абоненту будет звонить

. В таком случае, когда вы хотите вернуть наблюдаемую информацию о том, что вы выбираете асинхронно, вы можете использовать карту, как показано ниже.

object VideoRemoteSource: VideoDataSource {

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

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

}
...