gpt4 book ai didi

ios - 设置值时重复子节点 Firebase

转载 作者:行者123 更新时间:2023-12-03 00:56:16 24 4
gpt4 key购买 nike

过去几天我一直在尝试解决这个问题,但最终还是得到了相同的结果。当用户点击添加好友时,会将好友的 id 添加为“friends”下的节点(如预期);但是,当我尝试更新或设置该 id 的值时,它会再次添加该 id 和该值,而不是仅仅将该值添加到现有的子项中。我该如何制作它,以便在不添加其他 child 的情况下添加它?

enter image description here

这是添加好友的代码:

 func saveFriend(selectedFriend: FUser) {

if friendId.contains(selectedFriend.objectId as String) {

return
}

//get current friends
var currentFriends = FUser.currentUser()!.friends

currentFriends.append(selectedFriend.objectId)

let newDate = dateFormatter().string(from: Date())
let secondsDate: Int = Int(Date().timeIntervalSince1970)


updateUser(withValues: [kFRIEND : currentFriends, kUPDATEDAT : newDate, kSECONDSDATEUPDATED : secondsDate]) { (success) in

self.loadFriends()
NotificationCenter.default.post(name: .addedFriend, object: nil)

}


}

这是添加值的代码(我也尝试过并注释掉了 updateChildValues 并得到了相同的结果):

func increaseFriendshipValue(increase: Int) {
let friend = withUsers.first!.objectId
let friendValueRef = firebase.child(kUSER).child(FUser.currentId()).child(kFRIEND).child(friend)

// friendValueRef.updateChildValues([friend: +increase])

friendValueRef.setValue(increase)


}

编辑:这是我当前在“ friend ” View 中的内容,我在其中加载 friend 添加到数组的方式(没有值):

  @objc func loadFriends() {
cleanup()

let friendIds = FUser.currentUser()!.friends

if friendIds.count > 0 {

for friendId in friendIds {

firebase.child(kUSER).queryOrdered(byChild: kOBJECTID).queryEqual(toValue: friendId).observeSingleEvent(of: .value) { (snapshot) in

if snapshot.exists() {
let userDictionary = ((snapshot.value as! NSDictionary).allValues as Array).first

let fuser = FUser.init(_dictionary: userDictionary as! NSDictionary)

self.friends.append(fuser)
self.friendId.append(fuser.objectId)
self.friends.sort(by: {$0.username < $1.username})
}
self.tableView.reloadData()

}

}

} else {
ProgressHUD.showError("You currently have no friends saved. Please unlock some")
}

}

最佳答案

您正在以两种不同的格式写入数据。

首先在 saveFriend 中,您按以下格式编写:

"friends": {
"0": "uidOfTheUser",
"1": "uidOfAnotherUser"
}

然后在 increaseFriendshipValue 中,您将其更新为:

"friends": {
"uidOfTheUser": 1,
"uidOfAnotherUser": 0
}

由于您似乎想要实际保留每个用户的计数,因此我假设后者是正确的结构。这意味着您也需要在 saveFriend 中以该格式写入用户。

问题似乎出在:

var currentFriends = FUser.currentUser()!.friends

currentFriends.append(selectedFriend.objectId)

在这里,您将 selectedFriend.objectId 添加到数组中,这意味着 Swift 会生成一个新的数组元素:01 > 在上面的第一个 JSON 片段中。

您实际上想要做的是直接写入数据库,类似于您在 increaseFriendshipValue 中所做的操作。假设初始计数为 0,则类似于:

let friendsRef = firebase.child(kUSER).child(FUser.currentId()).child(kFRIEND)

let newFriendRef = child(selectedFriend.objectId)

newFriendRef.setValue(0)
<小时/>

需要注意的几点:

  1. 你真的应该是using a transaction增加好友值,否则多个用户的写入可能会覆盖彼此的结果。
  2. 目前,saveFriend 似乎存在覆盖好友现有值的重大风险。您可能会在代码中的某个位置检查用户是否已经成为好友,但在这里您也需要使用事务。
  3. 如果您在这两种情况下都使用事务,您可能需要将创建“ friend ”节点的代码和更新它的代码合并到一个函数中,因为它们看起来非常相似。<

关于ios - 设置值时重复子节点 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58424936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com