问题描述
我正在尝试一次下载多个项目。
假设我要下载10个项目,而每个项目要花1秒才能下载,我不希望它花10秒,而是1。
听起来像协程问题,对吧?
现在,它看起来像:
suspend fun getLanguageDictionaryDeferred(language: String): Result<JSONObject> {
val namespacesResponse = api.getNamespaces(language)
return if (namespacesResponse.isSuccessful) {
Result.success(getJson(namespacesResponse.body(),language))
} else {
Result.error("Error: ${namespacesResponse.code()}")
}
}
private suspend fun getJson(namespaces: List<Namespace>?,language: String): JSONObject {
val jsonObject = JSONObject()
namespaces?.forEach {
load(it,language)
}
return jsonObject
}
我认为问题出在这些功能上。我需要异步下载它们,但只要完成下载,便会通知结果。
我当时想这可能是getJson
对象的Deferred
函数调用await
函数的问题。但是,我将如何立即致电并立即等待它们呢?如果我不知道forEach
循环中的项目数怎么办?
谢谢!
编辑:
在进行测试时,我发现我们可以等待所有这样的事情:(尽管花费相同)
private suspend fun getJson(namespaces: List<Namespace>?,language: String): JSONObject {
val jsonObject = JSONObject()
namespaces?.map { async { load(it,language) } }?.awaitAll()
return jsonObject
}
但是,我不确定这样做是否正确并显示警告:
Ambiguous coroutineContext due to Coroutinescope receiver of suspend function
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)