Как заменить блокирующий код для чтения байтов в Kotlin - PullRequest
2 голосов
/ 11 июня 2019

У меня есть ktor приложение, которое ожидает файл из multipart в коде, подобном этому:

multipart.forEachPart { part ->
  when (part) {
    is PartData.FileItem -> {
      image = part.streamProvider().readAllBytes()
    }
    else -> // irrelevant
  }
}    

Intellij IDEA помечает readAllBytes() как неподходящий блокирующий вызов, так как ktor работает поверх сопрограмм. Как заменить этот блокирующий вызов на соответствующий?

1 Ответ

3 голосов
/ 11 июня 2019

Учитывая репутацию Ktor как неблокирующего, приостанавливающего IO-фреймворка, я был удивлен, что, очевидно, для FileItem нет ничего, кроме блокирующего InputStream API для его извлечения.Учитывая это, ваш единственный вариант - делегирование диспетчеру ввода-вывода:

image = withContext(Dispatchers.IO) { part.streamProvider().readBytes() }
...