Я пытаюсь запустить «пакетную» работу Firebase Firestore. Поскольку пакетное задание является асинхронным, и каждый пакет обрабатывает только 500 документов, я создал массив пакетных заданий, которые я хочу запускать синхронно, чтобы точно знать, когда выполняется последний пакет, а затем перейти к следующемуоперация.
Однако, чтобы сделать это в Kotlin, когда я прочитал, я натолкнулся на множество жаргонов, таких как runBlocking, Coroutine, Dispatcher, async, await, Context, Suspend, launch, join, Scope,Отложено, Продолжение, CommonPool
Кроме того, во многих постах говорится, что в последней версии Kotlin все изменилось. Kotlin документация говорит о runBlocking, но в этом посте говорится, что runBlocking - плохая вещь.
После некоторых проб и ошибок я получил это для компиляции
suspend fun doTheThing() {
for ( b in batchArray) {
coroutineScope {
val job = async { b.commit() }
job.await()
}}
}
Однако теперь я получаю сообщение об ошибке: «Функция приостановки 'doTheThing' должна вызываться только из сопрограммы или другой функции приостановки" В данный момент я просто сбит с толку. Я просто хочу сделать эти вызовы по очереди или подождать, пока все это не будет сделано. Не уверен, что правильный синтаксис, чтобы сделать это, и какие концепции я ошибаюсь.
Обновление : Кажется, работает следующий фрагмент кода:
for ( b in batchArray) {
runBlocking {b.commit()}
}
Это хорошая практика, чтобы делать это так?