我目前正在尝试围绕Web请求创建一个缓存层。到目前为止,我已经写了:
class Repository(private val webServices: WebServices) {
private var cachedItems: List<Item>? = null
suspend fun getItems(): List<Item> {
cachedItems?.let { return it }
val items = withContext(Dispatchers.IO) { webServices.getItems() }
cachedItems = items
return items
}
}
我担心的是,当两个调用者同时调用
getItems()
时会发生什么。理想情况下,我只希望发生一个Web请求。使用协程时建议使用什么方法来解决此问题? 最佳答案
这是一个简单的解决方案。
class Repository(private val webServices: WebServices) {
private val cachedItems = async(Dispatchers.IO, start = CoroutineStart.LAZY) {
webServices.getItems()
}
suspend fun getItems(): List<Item> {
return cachedItems.await()
}
}