Значение не удаляется из словаря

У меня есть словарь в Firebase под названием peopleWhoLike, ключ - это автоматический идентификатор, а значение - идентификатор пользователя, который мне понравился, я пытаюсь перебрать peopleWhoLike словарь и найти запись с текущими пользователями uid в качестве значения, чтобы я мог удалить его, но значение не удаляется.

func removeLike(postID: String){
    ref.child("posts").child(postID).observe(.value, with: { (snapshot) in
        if let info = snapshot.value as? [String : AnyObject]{
            if var peopleWhoLike = info["peopleWhoLike"] as? [String : String]{
                print("peopleWhoLike - \(peopleWhoLike)")
                for person in peopleWhoLike{
                    if person.value == FIRAuth.auth()!.currentUser!.uid{
                        peopleWhoLike.removeValue(forKey: person.key)
                        print("personkey - \(person.key)")
                    }
                }
            }
        }
    })
}

Оба оператора печати печатаются правильно, т.е. person.key быть правильным ключом

Скриншот

Любая помощь будет высоко ценится спасибо!

1 ответ

Решение

У вас есть только снимок (копия) данных там

удалить значение из базы данных firebase; попробуй это:

//path should be like this (i guess):
let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid
ref.child("posts")
   .child(postId)
   .child("peopleWhoLike")
   .chi‌​ld(currentUserUid)
   .rem‌​oveValue()

или то же самое:

let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid
ref.child("posts/\(postId)/peopleWhoLike/\(currentUserUid)").rem‌​oveValue()

ОБНОВИТЬ

вам нравится удалять ключ человека - тогда вы можете:

а) переберите peopleWhoLike и найдите, если это пользователь (но, пожалуйста, поставьте это let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid вне петли!

//path should be like this (i guess):
let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid

// loop and when match `person.value == currentUserUid` then:
ref.child("posts")
   .child(postId)
   .child("peopleWhoLike")
   .chi‌​ld(person.key)  //<-- change here
   .rem‌​oveValue()

б) вы ищете в запросе. и затем удалите полученный узел.

ref.child("posts")
   .child(postId)
   .child("peopleWhoLike")
   .startAt(currentUserId)
   .endAt(currentUserId)
   . [...] do something

я не знаю, можете ли вы позвонить напрямую .removeValue() с этой точки зрения. но с SingleEvent и снимком вы можете сделать snapshot.ref.removeValue() - двойная проверка перед удалением. но так как это приводит к ссылке, вы должны прямо в состоянии позвонить .removeValue()

ref.child("posts")
   .child(postId)
   .child("peopleWhoLike")
   .startAt(currentUserId)
   .endAt(currentUserId)
   .removeValue()

примечание: этот поиск занимает больше времени, чем прямой путь

смотрите здесь документ для запроса:

https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html

https://firebase.google.com/docs/database/ios/read-and-write

НОТА:

я бы посоветовал вам сохранить его с userUid в качестве ключа, потому что вам нужно только onliner для удаления (см. мой первый codenippet, где вам не нужно получать все данные из peopleWhoLike) и в качестве значения просто 1 или вы можете сохранить текущую дату (тогда вы знаете, когда она понравилась)

Другие вопросы по тегам