如何避免Datastore读取与Retrofit接口调用的协程竞态条件?
协程调用顺序与竞态条件问题解答
你的代码完全不会产生竞态条件,调用顺序是绝对可靠的,原因如下:
getUnits是挂起函数,其中dataStore.readStringDataStore(UNITS_KEY).first()会挂起当前协程,直到从Datastore拿到第一个结果才继续执行,所以getUnits必须等获取到单位数据后才会返回值。- 在
viewModelScope.launch的协程块里,val units = getUnits()这行执行时,协程会暂停在这里,直到getUnits返回结果,之后才会执行后面的Retrofit网络请求。
简单说,协程里的挂起函数是顺序执行的,前一个挂起操作完成前,后面的代码不会执行,所以你的依赖逻辑完全成立。
另外可以把getUnits的代码简化得更简洁:
private suspend fun getUnits(): Units { return dataStore.readStringDataStore(UNITS_KEY).first() ?.let { Units.valueOf(it) } ?: Units.FAHRENHEIT }
内容的提问来源于stack exchange,提问作者Kenny Sexton
相关产品推荐
相关产品推荐

