在这里我正在使用聊天应用程序,我想保持收件人方的未读计数。我在控制台中的json structre看起来像
user_history | |--> user_a_uuid |-> last_msg |-> last_msg_timestamp |-> unread_count
此问题的范围是如何增加unread_count
的值。之前递增的i具有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)
}
实际上,确切地说,我从here借用了该解决方案。我还尝试遵循doc。但事实是,我不想像文档中那样在根节点上运行事务。我只想在unread_count
文档上运行事务。
尝试这段代码后,我面临的问题是,unread_count
节点被删除,而当我在完成块内返回TransactionResult
时,它又添加了unread_count
。问题是该值不会由于unread_count
被删除而增加。它始终停留在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)
})
}