Запрос Firebase не возвращает никаких данных - PullRequest
0 голосов
/ 26 мая 2019

Моя модель данных выглядит следующим образом:

allcomments
|__$comment_id_5
         |__post_id: <post_id_5>



uid
|
|__activity
     |__comments
            |__$random_activity_id
                       |__post_id : <post_id_5> //ref to post_id_5 in allcomments
                       |__comment_id : <comment_id_5> // ref to comment_id_5 in allcomments 

Моя цель : чтобы проверить, прокомментировал ли пользователь с uid сообщение или нет.Если у этого человека есть, то я могу продолжить, иначе ему будет показано что-то еще на экране.Пытаясь выполнить следующий запрос, я могу получить обратный вызов только тогда, когда существует моментальный снимок, а не иначе.

FBDataservice.ds.child("allcomments").queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_5").observeSingleEvent(of: .ChildAdded) { (snapshot) in
        if let data = snapshot.value as? DataDict {
            let comment = Comment(comId: snapshot.key , comData: data)
            self.checkUserHasResponded(completion: { (hasResponded) in
                if !hasResponded {
                    // Never returns it there is nothng
                    print("You gotta respond first")
                } else {
                    //this part does work
                    print("Welcome to seeing everything")
                }
            })
        }
    }


func checkUserHasResponded(completion: @escaping (Bool) -> ()) {
    FBDataservice.ds.REF_USERS.child(uid).child("activity/comments").queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_5").observeSingleEvent(of: .value) { (snapshot) in
        snapshot.exists() ? completion(true) : completion(false)
    }
}

Я даже пытался настроить архитектуру таким образом и запросить ее по-другому, но все равно ничего не работает, и программаведет себя точно так же, как в случае выше.

uid
|
|__activity
     |__comments
            |__post_id_5 : comment_id_5

и выполнил этот запрос:

func checkUserHasResponded(completion: @escaping (Bool) -> ()) {
    FBDataservice.ds.REF_USERS.child(uid).child("activity/comments").observeSingleEvent(of: .value) { (snapshot) in
        snapshot.hasChild("post_id_5") ? completion(true) : completion(false)
    }
}

Я попытался изменить .childAdded на .value.Это дает точно такой же результат.Попробовал изменить .observeSingleEvent(of:) на .observe().Но ничего не помогает.Я не уверен, что именно не так.Проверьте множество ответов здесь, ни один не помог.Что именно я смотрюСпасибо за помощь.

1 Ответ

2 голосов
/ 26 мая 2019

Используйте .value вместо .childAdded, чтобы вызывать закрытие независимо от того, существует ли моментальный снимок, просто быстрый тест показывает, что он работает.

func checkUserHasResponded() {
    let uid = "uid_0"
    let commentsRef = dbRef.child(uid).child("activity").child("comments")
    commentsRef.queryOrdered(byChild: "post_id")
               .queryEqual(toValue: "post_5")
               .observeSingleEvent(of: .value) { snapshot in
        if snapshot.exists() {
            print("post exists")
        } else {
            print("post not found")
        }
    }
}

Если ваша структура не содержит post_idДочернее значение, которое существует, тогда вывод:

post not found

Так что этот ответ относится к обновленному вопросу.Код в замыкании не будет работать, если узел, к которому вы обращаетесь, не существует, потому что запрос использует .childAdded

FBDataservice.ds.child("allcomments").queryOrdered(byChild: "post_id")
                                 .queryEqual(toValue: "post_id_5")
                                 .observeSingleEvent(of: .childAdded) { (snapshot) in

Если значение изменено на .value, он возвращается, а код в замыканииработает, если узел существует.Имея в виду, что вы захотите использовать

snapshot.exists()

с этим, так как в противном случае он будет равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...