Мне интересно, как наиболее эффективно очистить данные списка, представленные в представлении, с помощью наблюдаемого объекта? На данный момент, каждый раз, когда я перезагружаю представление, данные дублируются (так как мы проверяем запрос на наличие обновлений и анализируем ответы). Это не ожидаемое поведение. Ожидаемое поведение - обновлять свойство @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]()
}