Ответы snapshotListener обновления Firestore вышли из строя даже при ожидании .get () - PullRequest
0 голосов
/ 12 октября 2018

Запуск hello-world для записи нескольких последовательных значений true / false в базу данных firestore с целью синхронизации локальной переменной с облаком.

Похоже, что события обратного вызова не соответствуютпорядок, даже когда каждый вызов update() ждет, прежде чем начать следующий вызов, используя get()

Я пишу «ложь», «истина», «истина», но ОТВЕТЫ «истина», «ложь',' true '

Даже странно, иногда есть 3 ответа, даже когда я только сделал 2 запроса.Могут ли вещи встать в очередь при следующем запуске приложения?Если это так, есть ли какой-нибудь способ быть уверенным в сбрасывании перед выключением?

Меня беспокоит, что мое локальное приложение может оставить неправильное представление о том, что является самым последним значением.

import com.google.auth.oauth2.GoogleCredentials
import com.google.cloud.firestore.FirestoreOptions
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val firestoreOptions = FirestoreOptions.newBuilder()
            .setCredentials(GoogleCredentials.fromStream(
                    ClassLoader.getSystemClassLoader().getResourceAsStream("serviceAccountKey.json")))
            .setTimestampsInSnapshotsEnabled(true)
            .build()
    val db = firestoreOptions.service!!

    val docRef = db.collection("users").document("tmpUser").collection("devices").document("tmpDevice")
    docRef.addSnapshotListener { snapshot, _ ->
        (snapshot?.data ?: mapOf()).forEach { key, value ->
            println("  RESPONSE: '$key'='$value'")
        }
    }
    println("Listening...")

    val writeResultFuture2 = docRef.update(mapOf("running" to false))
    println("REQUEST 'false' at ${writeResultFuture2.get().updateTime}")

    val writeResultFuture3 = docRef.update(mapOf("running" to true))
    println("REQUEST 'true' at ${writeResultFuture3.get().updateTime}")

    val writeResultFuture4 = docRef.update(mapOf("running" to true))
    println("REQUEST 'true' at ${writeResultFuture4.get().updateTime}")

    delay(5_000)
    println("Stopping.")
}

Вывод:

Listening...
  RESPONSE: 'running'='true'
  RESPONSE: 'running'='false'
REQUEST 'false' at 2018-10-12T21:07:25.530943000Z
REQUEST 'true' at 2018-10-12T21:07:25.686950000Z
  RESPONSE: 'running'='true'
REQUEST 'true' at 2018-10-12T21:07:25.686950000Z
Stopping.

1 Ответ

0 голосов
/ 13 октября 2018

Итак, короткий ответ: кажется, что он работает как задумано.

Во-первых, имейте в виду, что при создании updateListener он будет срабатывать не только при обновлении, но и в первый раз.с какими-либо данными уже существует в базе данных.(И это, как правило, то, что вы хотите - это делает ваш код намного проще для написания, потому что вы просто создаете свой обработчик как ваш обработчик «Все данные из базы данных», будь то из начального извлечения или обновления.) Так что этопочему вы получаете первый «истинный» ответ.

Второй «ложный» ответ - от первого примененного вами обновления.

Третий "истинный" ответ - от второго примененного вами обновления

Четвертый "истинный" ответ никогда не запускается, потому что клиентский SDK, как правило, достаточно умен, чтобы не вызывать обработчик снова, еслиданные из базы данных точно такие же, как данные, которые уже существуют.Я предполагаю, что если третий вызов обновления был изменен на что-то вроде «Возможно», то вы бы увидели этот четвертый ответ.

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