Похоже, вы хотите увеличить счетчик, сохраненный в узле, не затрагивая другие элементы в узле.На основании информации в вопросе, по-видимому, нет необходимости использовать блок транзакций в этом случае использования из-за того, что счет хранится в коде.
До увеличения у меня есть user_a_uuid иузел user_history & unread_count как константа
Я считаю, что это означает, что вы храните unread_count в переменной в коде, поэтому, если это правильно, это простодолжен быть увеличен в коде и записан в узел.
Начиная с дублированной структуры:
user_history
uid_0
last_msg: "some message"
last_msg_timestamp: "20181028075700"
unread_count: 2
и теперь мы добавили еще одно сообщение.Необходимо увеличить var, а затем обновить соответствующий узел в Firebase новым значением.Вот код, который делает это:
func updateMsgCount() {
self.unread_count += 1 //this is a class var or however it's stored in code
let unreadCountRef = self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.setValue(self.unread_count)
Предположим, однако, что unread_count хранится не в коде, а только в Firebase.Вот код, который нужно прочитать в узле unread_count, увеличить счетчик и сохранить его обратно в Firebase.
func updateCount() {
let unreadCountRef = self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.observeSingleEvent(of: .value, with: { snapshot in
var currentCount = snapshot.value as? Int ?? 0
currentCount += 1
unreadCountRef.setValue(currentCount)
})
}
Если вам действительно нужен блок транзакций, вот тот, который выполняет то же самое
func updateCountTransactionStyle() {
let unreadCountRef = self.ref.child("user_history").child("uid_0").child("unread_count")
unreadCountRef.runTransactionBlock( { (currentData: MutableData) -> TransactionResult in
var currentCount = currentData.value as? Int ?? 0
currentCount += 1
currentData.value = currentCount
return TransactionResult.success(withValue: currentData)
})
}