gpt4 book ai didi

android - 将流量转换为实时数据的最佳方式

转载 作者:行者123 更新时间:2023-12-05 08:36:06 25 4
gpt4 key购买 nike

我正在从 Unsplash api 实现搜索,数据将根据搜索进行更新

GalleryViewModel.kt

@HiltViewModel
class GalleryViewModel @Inject constructor(
private val fetchPhotoUseCase:FetchPhotoUseCase,
@Assisted state: SavedStateHandle
) :ViewModel(){

companion object{
private const val CURRENT_QUERY = "current_query" // key
private const val DEFAULT_QUERY = "cats"
}

private val currentQuery = state.getLiveData(CURRENT_QUERY, DEFAULT_QUERY)

val photos = currentQuery.switchMap { queryString ->
liveData {
fetchPhotoUseCase.execute(queryString).collect {
emit(it)
}
}
}

fun searchPhotos(query: String) {
currentQuery.value = query
}
}

FetchPhotoUseCase.kt

class FetchPhotoUseCase @Inject constructor(
private val repository: UnSplashRepository
) : UseCaseWithParams<String,Flow<PagingData<UnsplashPhoto>>>(){
override suspend fun buildUseCase(params: String): Flow<PagingData<UnsplashPhoto>> {
return repository.getSearchResult(params)
}
}

FetchPhotoUseCase 在领域层。它返回流,因此我将流更改为 switchmap lambda 中的实时数据。

我做的对吗?有没有更好的方法来实现它..

编辑

我已经更新了我的代码以在如下两个调度程序上工作..

suspend fun getPhotos(queryString: String) = withContext(Dispatchers.IO){
fetchPhotoUseCase.execute(queryString)
}

fun getImages(queryString: String) = liveData(Dispatchers.Main) {
getPhotos(queryString).collect {
emit(
it.map { unsplash ->
unSplashMapper.mapFromEntity(unsplash)
}
)
}
}

最佳答案

有一个方便的方法asLiveData ,它已经实现了你所写的内容:

val photos = currentQuery.switchMap { queryString ->
fetchPhotoUseCase.execute(queryString).asLiveData(Dispatchers.Main)
}

使用asLiveData()扩展函数的依赖:

def lifecycle_version = "2.4.0"

implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"

关于android - 将流量转换为实时数据的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70607233/

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