Как создать сопрограммный код без функции приостановки - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть метод с именем saveAccount

fun saveAccount(id: Int, newName: String): Account {
    val encryptedNames: List<String> = repository.findNamesById(id)
    val decryptedNames: List<String> = encryptedNames.map { cryptographyService.decrypt(it) }

    if(decryptedNames.contains(newName))
        throw IllegalStateException()

    return repository.save(newName)
}

Я хочу одновременно расшифровать все имена, поэтому я сделал:

suspend fun saveAccount(id: Int, newName: String): Account {
    val encryptedNames: List<String> = repository.findNamesById(id)

    val decryptedNames: List<String> = encryptedNames.map { 
        CoroutineScope(Dispatchers.IO).async {
            cryptographyService.decrypt(it) 
        } 
    }.awaitAll()

    if(decryptedNames.contains(newName))
        throw IllegalStateException()

    return repository.save(newName)
}

До сих пор все в порядке, но вопросэто: я не могу сделать saveAccount приостановить функцию.Что мне делать?

1 Ответ

0 голосов
/ 22 февраля 2019

Итак, вы хотите расшифровать каждое имя в отдельной сопрограмме, но saveAccount должен возвращаться только после завершения всей расшифровки.

Вы можете использовать runBlocking для этого:

fun saveAccount(id: Int, newName: String): Account {
    // ...
    val decryptedNames = runBlocking {
        encryptedNames.map {
            CoroutineScope(Dispatchers.IO).async {
                cryptographyService.decrypt(it) 
            }
        }.awaitAll()
    }
    // ...
}

Таким образом saveAccount не обязательно должно быть функцией suspend.

...