Возврат моментального снимка с компенсацией задержек в Firestore отличается в зависимости от пакета и транзакции - PullRequest
0 голосов
/ 05 апреля 2020

Моя пакетная запись возвращает странные результаты с компенсацией задержки для моих слушателей снимков. Пакет отлично выполняет запись в базу данных и не вызывает ошибок на клиенте, но прослушиватель снимка (в том же приложении), который прослушивает один из этих документов, возвращает странные результаты с задержкой. Пакет:

let db = Firestore.firestore()
let batch = db.batch()
let timestamp = FieldValue.serverTimestamp()

batch.updateData([
    "private.index.\(someId)": ["count": 0, "timestamp": timestamp]
], forDocument: db.collection("someCollection").document(uId))

batch.deleteDocument(db.collection("anotherCollection").document("\(uId)-\(someId)"))

batch.commit { (error) in

    if let error = error {
        print(error)
    }

}

Если прослушиватель моментальных снимков игнорирует возврат с hasPendingWrites, данные в порядке, потому что они с сервера (что правильно). Но если слушатель снимка позволяет данные с компенсацией задержки, я получаю это:

["count": 0, "t": <null>]]

В то время как данные с сервера (и транзакций) выглядят так:

["count": 0, "t": <FIRTimestamp: seconds=1586033607 nanoseconds=198000000>]]

Нет причина, по которой метка времени должна быть равна нулю.

Что еще странно, если я выполняю ту же задачу в транзакции, проблем не возникает, даже с данными с задержкой (это правильно).

db.runTransaction({ (trans, errorPointer) -> Any? in

    trans.updateData([
        "private.index.\(someId)": ["count": 0, "timestamp": timestamp]
    ], forDocument: db.collection("someCollection").document(uId))

    trans.deleteDocument(db.collection("anotherCollection").document("\(uId)-\(someId)"))

    return nil

}) { (_, error) in

    if let error = error {
        print(error)
    }

}

Ожидается ли, что пакетная запись иногда не даст согласованных результатов с задержкой, поскольку они не работают точно так же, как транзакции?

1 Ответ

1 голос
/ 05 апреля 2020

Я недавно написал сообщение в блоге именно об этом поведении временных меток сервера . Это не имеет ничего общего с пакетами - обычные записи старого документа будут демонстрировать то же поведение. То, что вы видите, на самом деле является ожидаемым поведением. Но транзакции ведут себя по-разному, потому что локальный кеш не участвует в поведении транзакций, так как для этого требуется полная синхронизация c с сервером (нет ожидающих записей для наблюдения за транзакциями).

Если вы абсолютно нужна метка времени в снимке, который еще не был синхронизирован, вы должны не использовать getData () без аргументов для получения данных в снимке. Вместо этого вы должны использовать getData (serverTimestampBehavior) . Передаваемый вами аргумент:

Настраивает поведение для временных меток сервера, для которых еще не установлено окончательное значение.

Ваши параметры для ServerTimestampBehavior позвольте вам выбрать, хотите ли вы получить оценку, нет (ноль, как вы видите сейчас) или предыдущее значение поля. Похоже, вы хотите оценить.

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