Получить конкретный .childrenCount от Firebase - PullRequest
0 голосов
/ 21 октября 2019

В моем новом приложении (Project Control, iOS App Store;)) я хочу, чтобы пользователи принимали участие в разработке решений. Для этого я добавил путь в моей базе данных Firebase под названием «хлопки». Я хотел бы ввести число следующих в моем TableView для различных концепций. Я попробовал следующее

self.posts.append(Post(title: post_title, des: post_description, info: "\(post_date) - \(post_user) - \(post_claps) ?", claps: Int(post_claps)))

for var item in self.posts {

    g.ref.child("concepts").child(item.title).queryOrdered(byChild: "claps").observe(.childAdded) { (snapshotClaps: DataSnapshot!) in

        item.claps = Int(snapshotClaps.childrenCount)

    }

}

DispatchQueue.main.async() {

    self.tableView.reloadData()

}

Тем не менее, оно еще не является правильным, но перед ним. Я не знаю, как сделать ссылку более конкретной, чтобы действительно получить только то, что под хлопками.

Это моя база данных:

FirebaseDatabase structure

В настоящее время у меня выводится 5, но должно быть 4. Вы видите, что он наблюдал один «слой» раньше. Помощь будет оценена. Улучшения тоже:)

ОБНОВЛЕНИЕ:

Посредством тестирования я мог обнаружить, что проблема в ссылке. Пятерка Int поступает от 5 Childs из «верхнего слоя» «Journal». Моя проблема в том, что я не могу углубиться в структуру, потому что у меня нет конкретной строки для .child ()

Ответы [ 3 ]

3 голосов
/ 21 октября 2019

Поскольку вы наблюдаете событие .childAdded, ваше закрытие вызывается для каждого соответствующего дочернего узла. Если вы хотите посчитать количество совпадающих дочерних узлов, вам нужно наблюдать событие .value, которое гарантирует, что ваше закрытие будет вызвано для всех совпадающих узлов одновременно.

Что-то вроде:

g.ref.child("concepts").child(item.title).observe(.value) { (snapshotClaps: DataSnapshot!) in
    item.claps = Int(snapshotClaps.childrenCount)
}

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

1 голос
/ 21 октября 2019

создайте массив и дайте базе огня заполнить его. или сделайте что-то вроде

g.ref.child("concepts").child(item.title).observe(.value) { (snapshotClaps: DataSnapshot!) in
    item.claps = Int(snapshotClaps.childrenCount)
}

, наблюдая, как ваше закрытие получает совпадающие узлы.

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

Есть несколько отличных решений, но проблема в чтении узла по .value заключается в том, что он читает в все в этом узле.

Хотя это было бы хорошо для узлов, которые имеютограниченный объем данных, он будет перегружать устройство, когда узел содержит много данных.

Поэтому другой вариант - использовать, чтобы Firebase выполнял все события .childAdded до событий .value. Таким образом, мы можем использовать .value в качестве триггера, чтобы все узлы были прочитаны.

Вот функция, которая использует .childAdded для итерации и подсчета всех пользователей в узле users. Кроме того, существует наблюдатель .value, который считывает только последний узел, удаляет наблюдателя .childAdded и передает счет обратно вызывающей функции через обработчик завершения. Помните, что хотя мы присоединяем обоих наблюдателей, все события .childAdded будут срабатывать до события .value.

func countUsers( completion: @escaping(Int) -> Void) {
    var count = 0

    let usersRef = self.ref.child("users")
    usersRef.observe(.childAdded, with: { snapshot in
        count+=1
    })

    let query = usersRef.queryOrderedByKey().queryLimited(toLast: 1)
    query.observeSingleEvent(of: .value, with: { snapshot in
        usersRef.removeAllObservers()
        completion(count)
    })
}

для вызова функции, вот код

func getUserCount() {
    self.countUsers(completion: { userCount in
        print("number of users: \(userCount)")
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...