Не заходит в viewModelScope

только начинаю свой путь в Kotlin. Прошу дать подсказку куда копать. Есть ViewModel класс с таким методом

    private fun sendAnswers() {
        Log.d(TAG, "TaskExecutionViewModel: Sending answers")

        try {
            for (item in capturedImages) {
                Log.d(
                    TAG,
                    "TaskExecutionViewModel: Sending answers (${capturedImages.count()}), idSmenZad: ${item.taskId}, idAction: ${item.actionId}, images: ${item.images.count()}"
                )
                viewModelScope.launch {
                    Log.d(TAG, "TaskExecutionViewModel: In viewModelScope")
                    val res = withContext(Dispatchers.IO) {
                        sendAnswersUseCase(item.taskId, item.actionId, item.images.toList(), item.timeStart)
                    }
                    if (res.isSuccess) {
                        Log.d(
                            TAG,
                            "TaskExecutionViewModel: Answers sent successfully, preparing next answer"
                        )
                    } else {
                        Log.d(
                            TAG,
                            "TaskExecutionViewModel: Answers sent failure, preparing next answer"
                        )
                    }
                }
            }
            capturedImages.clear()
            _state.value = TaskExecutionState.Completed
        } catch (e: Exception) {
            Log.e(TAG, "TaskExecutionViewModel: Failed to send answers: ${e.message}", e)
            _state.value = TaskExecutionState.Error("Failed to send answers: ${e.message}")
        }
    }

Лог получается следующий

D  TaskExecutionViewModel: Sending answers
D  TaskExecutionViewModel: Sending answers (2), idSmenZad: 7, idAction: 4, images: 1
D  TaskExecutionViewModel: Sending answers (2), idSmenZad: 8, idAction: 4, images: 1

Код внутри viewModelScope.launch не выполняется, что не так?

Если нужно что-то еще предоставить - пишите


Ответы (1 шт):

Автор решения: Wlad

вы берете список, начинаете проходить по его элемент и на каждый элемент запускаете корутину. затем, недожидаясь завершения работы корутин, вы очищаете этот список.

вам стоит преобразовать ваш код к следующему виду:

fun myFun(){
  viewModelScope.launch{
    list.map{
      launch{
      // асинхронное выполнение для каждого объекта
     }
   }.joinAll()
   list.clear()
  }
}

таким образом, вы сможете запустить на каждый элемент отдельную корутину, дождаться завершения их работы и только затем очистить список.

p.s. код писал в блокноте, поэтому могут быть неточности.
p.p.s. чтобы запустить билддер .launch внутри корутины, скорее всего надо будет ее запустить внутри блока withContext().

→ Ссылка