如何在 GlobalScope 之后排队 Coroutines viewModelScope 作业
How to enqueue Coroutines viewModelScope job after GlobalScope one
我有一个应用程序范围函数,它像这样从服务器请求访问令牌
fun getToken() {
GlobalScope.launch {
...
val response = webservice.getToken().awaitResponse()
//save token
}
}
我在存储库中也有函数,这些函数从服务器请求数据并从视图模型启动,就像这样
//in a ViewModel
fun getData() {
viewModelScope.launch(Dispatchers.IO) {
repository.getData()
}
}
//in a Repository
fun getData() {
...
val response = webservice.getData().awaitResponse()
//handle response
}
如何让数据请求仅在有访问令牌可用时才发送?
我唯一想到的是在像这样的每个数据请求之前检查并请求令牌(如果需要)
fun getData() {
var response: Response
token?.let {
response = webservice.getToken().awaitResponse()
//save token
}
...
response = webservice.getData().awaitResponse()
//handle response
}
但是当不同的存储库中有许多不同的数据请求时,这是正确的使用方法吗?
您可以这样做:
object InternalScope {
private val tokenJob = GlobalScope.launch {
response = webservice.getToken().awaitResponse()
}
suspend fun <T> runWithContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
tokenJob.join()
return withContext(context, block)
}
}
您可以像这样使用它:
InternalScope.runWithContext(Dispatchers.IO){}
我有一个应用程序范围函数,它像这样从服务器请求访问令牌
fun getToken() {
GlobalScope.launch {
...
val response = webservice.getToken().awaitResponse()
//save token
}
}
我在存储库中也有函数,这些函数从服务器请求数据并从视图模型启动,就像这样
//in a ViewModel
fun getData() {
viewModelScope.launch(Dispatchers.IO) {
repository.getData()
}
}
//in a Repository
fun getData() {
...
val response = webservice.getData().awaitResponse()
//handle response
}
如何让数据请求仅在有访问令牌可用时才发送?
我唯一想到的是在像这样的每个数据请求之前检查并请求令牌(如果需要)
fun getData() {
var response: Response
token?.let {
response = webservice.getToken().awaitResponse()
//save token
}
...
response = webservice.getData().awaitResponse()
//handle response
}
但是当不同的存储库中有许多不同的数据请求时,这是正确的使用方法吗?
您可以这样做:
object InternalScope {
private val tokenJob = GlobalScope.launch {
response = webservice.getToken().awaitResponse()
}
suspend fun <T> runWithContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
tokenJob.join()
return withContext(context, block)
}
}
您可以像这样使用它:
InternalScope.runWithContext(Dispatchers.IO){}