我目前正在尝试围绕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()
  }
}

10-08 17:58