Использование базы данных Firebase Realtime со списком SwiftUI - очистка списка - PullRequest
0 голосов
/ 13 апреля 2020

Мне интересно, как наиболее эффективно очистить данные списка, представленные в представлении, с помощью наблюдаемого объекта? На данный момент, каждый раз, когда я перезагружаю представление, данные дублируются (так как мы проверяем запрос на наличие обновлений и анализируем ответы). Это не ожидаемое поведение. Ожидаемое поведение - обновлять свойство @Published только в том случае, если база данных указывает, что получено новое уведомление.

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

Я попытался очистить список .onAppear, но в результате cra sh указал, что я пытался удалить раздел в то время как уже было 0 разделов, так что это не сработало.

Я думал о возможности предоставить объекту сообщения уникальный идентификатор Stati c для загрузки с объектом сообщения при отправке в Firebase (или используя сам ключ пожарной базы). Таким образом, я мог бы использовать набор объектов словаря, используя уникальный идентификатор для идентификации объекта в словаре. Это может помочь мне избежать повторяющихся записей.

struct Updates: View {
    @ObservedObject var dataController = DataController()
    var body: some View {
        ZStack {

            VStack {

                List {

                    ForEach(self.dataController.messages, id: \.id) { message in
                            Text(message.message)
                        }

                    }
                }.onAppear {

                    self.dataController.query.observe(.childAdded) { snapshot in
                        let data = JSON(snapshot.value as Any)

                        if let message = Message.parseFirebaseQuery(dataJSON: data){
                            self.dataController.messages.append(message)
                        }
                    }
                }
        }
    }
}
class DataController: ObservableObject {

    @Published var query = ChatPathsAndReferences.refs.databaseMessages.queryLimited(toLast:100).queryOrdered(byChild: "date")
    @Published var messages = [Message]()

}
...