Оператор логического ИЛИ в Firestore с SnapshotListener вызывает проблемы слияния - PullRequest
0 голосов
/ 26 марта 2019

Я использую приведенный ниже код для извлечения двух списков документов из 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 к каждому запросу, наборы результатов для каждого ведут себя неожиданно.Слушатель будет запускать каждый из них по отдельности, в результате чего объединенная коллекция будет содержать дубликаты.Я попробовал комбинацию настроек, каждая из которых имела свой собственный набор проблем, что привело меня к мысли, что у меня есть некоторые серьезные недостатки в моих запросах или в моей модели данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...