Я использую приведенный ниже код для извлечения двух списков документов из Firebase и объединения их в одну коллекцию в качестве источника табличного представления в соответствии с рекомендациями документации Firebase при обработке логических операторов OR.
let db = Firestore.firestore()
var sessions = [Session]()
db.collection("sessions")
.whereField("createdByUser.id", isEqualTo: userUID)
.whereField("startTime", isGreaterThan: Timestamp(date: Date()))
.whereField("status", isEqualTo: SessionStatus.Approved.rawValue)
.order(by: "startTime", descending: true)
.addSnapshotListener({ (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
var cSessions = [Session]()
for document in documents {
if var session = Session(data: document.data()) {
session.id = document.documentID
cSessions.append(session)
}
}
db.collection("sessions")
.whereField("joinedByUser.id", isEqualTo: userUID)
.whereField("startTime", isGreaterThan: Timestamp(date: Date()))
.whereField("status", isEqualTo: SessionStatus.Approved.rawValue)
.order(by: "startTime", descending: true)
.addSnapshotListener({ (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
var jSessions = [Session]()
for document in documents {
if var session = Session(data: document.data()) {
session.id = document.documentID
jSessions.append(session)
}
}
sessions.append(contentsOf: cSessions)
sessions.append(contentsOf: jSessions)
completion(sessions)
})
})
Однако, когда я добавляю Snapshotlistener к каждому запросу, наборы результатов для каждого ведут себя неожиданно.Слушатель будет запускать каждый из них по отдельности, в результате чего объединенная коллекция будет содержать дубликаты.Я попробовал комбинацию настроек, каждая из которых имела свой собственный набор проблем, что привело меня к мысли, что у меня есть некоторые серьезные недостатки в моих запросах или в моей модели данных.
Документы на самом деле не отображаютсякак обращаться со слушателями в подзапросах, так что я в основном в своем уме, прежде чем перестроить всю свою модель данных.