gpt4 book ai didi

android - 使用 kotlin co 例程从单个函数返回多次

转载 作者:行者123 更新时间:2023-12-02 13:12:08 24 4
gpt4 key购买 nike

在此 Repository 类中,只有一个称为 getMovies 的公共(public)函数,直接从 useCase 类调用。

现在的问题是我希望这个函数从一次调用中多次返回 movieData ,首先我想从数据库本地获取数据并返回它,然后从远程获取并执行一些逻辑&在该逻辑结束后我想返回还有最终值我如何使用协程来做到这一点。

整个解决方案位于 getMovies func 的返回行中。

注意:这可以使用 liveData 或 rx 来完成,但我不想使用它们中的任何一个,因为通过所有这些以 viewModel 结尾的层传递 livedata 并不是一个好主意。

这是存储库类:

@Singleton
class MovieRepository @Inject constructor(
private val movieDao: MovieDao,
private val movieApi: MovieApi,
private val trailerApi: TrailerApi) : BaseRepository() {

suspend fun getMovies(): ArrayList<Movie> {
val localData = fetchMoviesLocal()
val remoteData = fetchMoviesRemote()
val syncedData = storeMoviesLocal(remoteData)
return localData then syncedData
}

private fun fetchMoviesLocal(): ArrayList<Movie> = movieDao.fetchAllMovies()

private suspend fun fetchMoviesRemote(): ArrayList<Movie>? {
val data = safeApiCall({ movieApi.getMostPopular(AppConstants.API_KEY) },
"fetching movies")
return if (data != null) data.results as ArrayList<Movie> else null
}

private fun storeMoviesLocal(results: List<Movie>?): ArrayList<Movie>? {
return if (!results.isNullOrEmpty()) syncFavWithDb(results) else null
}

private fun syncFavWithDb(movies: List<Movie>): ArrayList<Movie> {
val tempList = ArrayList<Movie>()
movies.forEach { movie -> movie.isFav = if (isMovieLiked(movie.id)) 1 else 0; tempList.add(movie) }
movieDao.insertAll(tempList)
return tempList
}}

最佳答案

Kotlin 1.3 引入了自己的冷异步流的稳定版本 - Flows :

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow

fun getMovies(): Flow<List<Movie>> = flow {
val localData = fetchMoviesLocal()
emit(localData)

val remoteData = fetchMoviesRemote()
val syncedData = storeMoviesLocal(remoteData)
emit(syncedData)
}

关于android - 使用 kotlin co 例程从单个函数返回多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com