Firebase запрашивает завершенное событие - PullRequest
0 голосов
/ 24 апреля 2018

Прежде всего, я новичок в базе данных Firebase. Мне нужно сделать несколько звонков, чтобы получить некоторые данные. Я могу получить эти данные вот так.

 val query = mDatabaseReference
            ?.child("Node1")
            ?.child("Node1_id")

    val hostList = mutableListOf<Class>()

    query?.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(databaseError: DatabaseError) {}

        override fun onDataChange(dataSnapshot: DataSnapshot) {

            dataSnapshot.children.forEach({ node1Details ->
                val hostDetailsQuery = mDatabaseReference
                        ?.child("Node1Details")
                        ?.child(node1Details.key)


                hostDetailsQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
                    override fun onCancelled(databaseError: DatabaseError) {

                    }

                    override fun onDataChange(dataSnapshot: DataSnapshot) {

                        val host = dataSnapshot.getValue(MyClass::class.java)

                        val ratingQuery = mDatabaseReference
                                ?.child("Rating")
                                ?.child(node1Details.key)
                                ?.child(id)

                        ratingQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
                            override fun onCancelled(databaseError: DatabaseError) {

                            }

                            override fun onDataChange(dataSnapshot: DataSnapshot) {

                                host?.myRating = if (dataSnapshot.value == null) 0 else (dataSnapshot.value as Long).toInt()

                                hostList.add(host!!)

                            }
                        })
                    }
                })
            })
        }
    })

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

Надеюсь, я был ясен, и надеюсь, что кто-нибудь может мне помочь.

Спасибо заранее.

1 Ответ

0 голосов
/ 25 апреля 2018

Это происходит потому, что функции onDataChange() имеют асинхронное поведение, что означает, что они вызываются даже до того, как вы пытаетесь добавить эти объекты в hostList.Другими словами, к тому времени, когда вы пытаетесь использовать список вне функции onDataChange(), данные еще не закончили загрузку из базы данных, и поэтому список всегда пуст.

Вы можете решить эту проблемупроблема в двух отношениях.Одним из способов было бы объявить и использовать список только внутри функции onDataChange(), например:

ratingQuery?.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onCancelled(databaseError: DatabaseError) {}

    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val hostList = mutableListOf<Class>()
        host?.myRating = if (dataSnapshot.value == null) 0 else (dataSnapshot.value as Long).toInt()
        hostList.add(host!!)
        //Do what you want with your list
    }
})

Второй подход - создать собственный обратный вызов, ожидающий, пока Firebase вернет вам данные, ия рекомендую вам посмотреть последнюю часть моего ответа из этого поста , а также взглянуть на это видео .Ответ написан на Java, но схож с Котлином.

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