Как увеличить значение в определенном узле с базой данных реального времени firebase ios - PullRequest
0 голосов
/ 28 октября 2018

Здесь я работаю в приложении чата, я хочу сохранить количество непрочитанных сообщений для получателя.Моя структура json в консоли выглядит так:

user_history
|
|--> user_a_uuid
    |-> last_msg
    |-> last_msg_timestamp
    |-> unread_count

. Суть вопроса в том, как увеличить значение unread_count.До приращения у меня есть user_a_uuid и узел user_history & unread_count в качестве константы.Поэтому я попытался сделать следующее:

dbRef.child("user_history")
     .child(user_a_uuid)
     .child("unread_count")
     .runTransactionBlock { (unreadCount) -> TransactionResult in 
        var value = unreadCount.value as? Int

        if value == nil {
            value = 0
        }

        unreadCount.value = value! + 1
        return TransactionResult.success(withValue: unreadCount)
}

На самом деле, если быть точным, я позаимствовал это решение у здесь .Я также пытался следовать документ .Но дело в том, что я не хочу запускать транзакции на корневом узле, как в документе.Я хочу выполнить транзакцию только на unread_count документ.

Проблема, с которой я сталкиваюсь:

После попытки этого кода, проблема, с которой я сталкиваюсь, заключается в том, что unread_count узел удаляетсякак только я вернул TransactionResult внутри блока завершения, он добавил unread_count.Проблема в том, что значение не увеличивается из-за удаления unread_count.Всегда остается 1.

Заранее спасибо.

1 Ответ

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

Похоже, вы хотите увеличить счетчик, сохраненный в узле, не затрагивая другие элементы в узле.На основании информации в вопросе, по-видимому, нет необходимости использовать блок транзакций в этом случае использования из-за того, что счет хранится в коде.

До увеличения у меня есть 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)
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...