Kotlin For Loop Timing - PullRequest
       11

Kotlin For Loop Timing

0 голосов
/ 12 сентября 2018

Итак, я пытаюсь сделать так, чтобы в игру вошли два игрока, и я борюсь за время выполнения цикла for.Я использую Firebase Firestore в качестве моего бэкенда.Я хочу, чтобы каждая итерация цикла ожидала завершения последней, потому что каждая транзакция внутри цикла занимает секунду или две, и я хочу присоединиться только к одной игре.Прямо сейчас он в основном объединяет все пустые игры, потому что цикл for не ожидает завершения последнего цикла.Я считаю, что это асинхронная / синхронная проблема.

Вот мой код цикла:

for (document: DocumentSnapshot in task.result) {
                            firestoreInstance.runTransaction(Transaction.Function<Void> { transaction ->
                                val snapshot = transaction.get(document.reference)
                                transaction.update(document.reference, "joiner", FirebaseAuth.getInstance().uid)

                                // Success
                                null
                            }).addOnSuccessListener {
                                Log.d(TAG, "Transaction success!")
                                onComplete(document.reference)
                                gameJoined = true
                            }.addOnFailureListener { e ->
                                Log.w(TAG, "Transaction failure.", e)
                                onComplete(null)
                            }
                        }

Любой совет будет полезен.Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Использовать рекурсию:

fun myLoopOrWhatever(result: List<DocumentSnapshot>, index: Int) {
    val doc = result[index]

    firestoreInstance.runTransaction(Transaction.Function<Void> { transaction -> 
        val snapshot = transaction.get(doc.reference)
        transation.update(doc.reference, "joiner", FirebaseAuth.getInstance().uid)
        null
    }).addOnSuccessListener {
        //your logic
        if (index < result.size) myLoopOrWhatever(result, index++)
    }.addOnFailureListener { e -> 
        //your logic
        if (index < result.size) myLoopOrWhatever(result, index++)
    }
}

Запустите его, передав task.result и 0.

Я просто предполагаю, что task.result - это объект List. Это может быть ArrayList или что-то еще. Возможно, вам придется настроить этот тип.

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