Я собираюсь сделать попытку и подойти к вопросу, предложив альтернативное направление.Если это далеко от базы, дайте мне знать, и я могу обновить или удалить.
В этом вопросе много кода для сортировки, но на первый взгляд кажется, что добавлено большое количество наблюдателей, которые перезагружаютданных и частого обновления tableView.
Из того, что я вижу, узел каналов используется для сбора групп данных;группа сообщений, в которых заинтересован пользователь, группа дат, группа друзей и т. д., каждая из которых является фидом, и к каждому узлу, связанному с этим фидом, добавлен наблюдатель.
Мое предложение состоит в том, чтобы пойтина более высоком уровне - вместо того, чтобы обращаться к каждому дочернему узлу с отдельным независимым наблюдателем, скажем «Эй, Firebase, внутри этого родительского узла, если дочерний узел соответствует определенным критериям, сообщите пользователю об этом»
Итак, давайте используем глубокие запросы Firebase, чтобы сделать то же самое с гораздо меньшим количеством наблюдателей.
Возьмем пример структуры сообщений
posts
post_0
name: "Jim"
post: "We have them just where they want us"
watched_by:
uid_0: true
uid_1: true
post_1
name: "Spock"
post: "Nothing unreal exists"
watched_by:
uid_1: true
post_2
name: "Bones"
post: "I'm a doctor, not an escalator"
watched_by
uid_0: true
и предположим, что пользователь с uid_0 аутентифицируется.Ранее они решили посмотреть посты Джима и Кости.Как вы можете видеть из структуры, у нас есть узел watched_by в каждом сообщении и мы добавили uid_0: true к этому узлу.
Итак, давайте теперь позволим uid_0 наблюдать за узлом сообщений на предмет изменений в сообщениях, которыми они являются.интересует:
let postsRef = self.ref.child("posts")
let watchedByQuery = postsRef.queryOrdered(byChild: "/watched_by/uid_0").queryEqual(toValue: true)
watchedByQuery.observe(.childChanged, with: { snapshot in
let dict = snapshot.value as! [String: Any]
let post = dict["post"] as! String
print(snapshot.key, post)
})
поэтому, если Кости войдет в систему и изменит свой пост с «Я врач, а не эскалатор» на «Я врач, а не каменщик», этот узел будет отправленк uid_0, чтобы пользовательский интерфейс мог быть обновлен.
post_2
name: "Bones"
post: "I'm a doctor, not a bricklayer"
watched_by
uid_0: true
расширяя это, мы, очевидно, добавили бы .childAdded и .childRemoved, используя ту же технику, и .childAdded заполнил бы наш источник данных tableView первоначально для каждого пользователя, так какони аутентифицируются.
Предположим, Кости затем полностью удаляет свой пост (узел).Любой пользователь в списке watched_by будет уведомлен об этом событии (даже миллионы пользователей).Когда это происходит, в коде прочитайте ключ post_2 из моментального снимка, найдите его в своем массиве источника данных, удалите его и обновите tableView.
Опять же - полный ответ в мрачном ответе с моей стороны.