如何使用Firebase实时数据库iOS在特定节点中增加值

时间:2018-10-28 04:11:01

标签: ios swift firebase firebase-realtime-database transactions

在这里我正在使用聊天应用程序,我想保持收件人方的未读计数。我在控制台中的json structre看起来像

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

此问题的范围是如何增加unread_count的值。之前递增的i具有user_a_uuid和节点user_historyunread_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)
}

实际上,确切地说,我从here借用了该解决方案。我还尝试遵循doc。但事实是,我不想像文档中那样在根节点上运行事务。我只想在unread_count文档上运行事务。

我面临的问题:

尝试这段代码后,我面临的问题是,unread_count节点被删除,而当我在完成块内返回TransactionResult时,它又添加了unread_count。问题是该值不会由于unread_count被删除而增加。它始终停留在1

谢谢。

1 个答案:

答案 0 :(得分:0)

您似乎想要增加存储在节点中的计数器,而又不影响节点中的其他项目。根据问题中的信息,由于计数存储在代码中,因此在此用例中似乎不需要使用事务块。

  

在递增之前,我有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)
    })
}