【问题标题】:Kotlin For Loop TimingKotlin For 循环时序
【发布时间】:2018-09-11 23:32:30
【问题描述】:

所以我试图将两个玩家匹配到一个游戏中,并且正在努力解决 for 循环执行时间问题。我正在使用 firebase firestore 作为我的后端。我希望每个 for 循环迭代都等到最后一个完成,因为循环内的每个事务都需要一两秒钟,我只想加入一个游戏。现在它基本上加入了所有空游戏,因为 for 循环不等待最后一个循环完成。我相信这是一个异步/同步问题。

这是我的 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)
                            }
                        }

任何建议都会有所帮助。谢谢!

【问题讨论】:

    标签: android firebase for-loop kotlin google-cloud-firestore


    【解决方案1】:

    使用递归:

    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.result0 开始它。

    我只是猜测task.result 是一个 List 对象。它可能是一个 ArrayList 或其他东西。您可能需要调整该类型。

    【讨论】:

    • 我之前确实尝试过,但略有不同。这行得通。谢谢!
    猜你喜欢
    • 2018-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多