如何将 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)
}
}
}
我查询了 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)
}
}
}