Если перед тем, как выполнить откат, вы заметили, что изменение было выполнено на короткое время, чаще всего это происходит из-за наличия правила безопасности , которое отклоняет изменение.
В этом случае клиент сначала запускает локальные события для изменения, а затем отправляет изменение на сервер. Затем, когда он слышит от сервера, что изменение было отклонено, он запускает локальные события, чтобы снова получить правильное состояние.
Так что в вашем случае вам разрешено удалить узел из pending
, но не разрешено добавлять данные в posts
.
Хороший способ предотвратить этот тип частичной операции - включить как удаление, так и запись в один, операция многократного обновления.
ref = Database.database().reference()
self.ref.child("pending").child(event.id!).observe(.value, with: { (snapshot) in
var updates = [
"posts/\(event.id!)": snapshot.value,
"pending/\(event.id!)": nil
]
self.ref. updateChildValues(updates)
})
С этим кодом и запись нового узла, и удаление старого узла отправляются в базу данных как одна операция, поэтому также принимаются или отклоняются вашей безопасностью правила как единое целое.