Дублирует дочерний узел при установке значения Firebase - PullRequest
4 голосов
/ 17 октября 2019

Я пытался исправить это в течение последних нескольких дней, но продолжаю приводить к тому же результату. Когда пользователь щелкает, чтобы добавить друга, он добавляет идентификатор друга в качестве узла в разделе «друзья» (как и ожидалось);однако, когда я пытаюсь обновить или установить значение для этого идентификатора, он снова добавляет идентификатор со значением вместо простого добавления значения к существующему дочернему элементу. Как мне сделать так, чтобы это добавлялось без добавления целого другого ребенка?

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)


}

Редактировать: Это то, что у меня сейчас есть в моем представлении друзей, где я загружаю друзей из того, как они былидобавляется в массив (без значения):

  @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")
    }

}

1 Ответ

0 голосов
/ 17 октября 2019

Вы пишете данные в двух разных форматах.

Сначала в 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 генерирует новый элемент массива: 0 и 1 в первом фрагменте JSON выше.

Что вы на самом деле захотите сделать, так это написать прямо в базу данных, подобночто вы делаете в increaseFriendshipValue. Предполагая, что начальный счет равен 0, это будет что-то вроде:

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

let newFriendRef = child(selectedFriend.objectId)

newFriendRef.setValue(0)

Несколько замечаний:

  1. Вы действительно должны быть использование транзакции для увеличения значения друга, так как в противном случае записи от нескольких пользователей могут перезаписать результаты друг друга.
  2. В настоящее время saveFriend, по-видимому, имеет значительный риск перезаписи существующего значения для друга. Вы, вероятно, проверяете, есть ли у друзей уже дружественные отношения где-то в коде, но и здесь вы захотите использовать транзакцию.
  3. Если вы используете транзакцию в обоих случаях, вы можете объединитькод для создания узла «друг» и код для его обновления в одну функцию, так как они будут выглядеть очень похоже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...