Как избежать дублирования документов в пожарном магазине? - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь проверить, существует ли уже событие FB как документ в моей коллекции Firestore, и если нет, записать новое событие FB как новый документ. Моя проблема заключается в том, что при сравнении словаря результатов анализа проанализированного графа с fbEventIds в моей коллекции логика настроена неправильно и создает ошибки, а не избегает их.

Логически, как настроена моя функция:

func getFbEvents {

     fbgraphrequest {

         parse graphrequest results into an Event object {

            get Firestore snapshot of 'events' collection {

               //Compare graph request event id to event ids stored in firestore
               if graphrequesteventId == FirestoresnapshoteventsFbId {
                  return
               }
               else {
                setdata of new fb event in firestore events collection
    }}}}}

Фактический код

Я пытался добавить в DispatchGroup и DispatchQueue команды ввода и выхода послесловарь анализируется и до получения снимка на основе других потоков SO, но он все равно не работает в моем коде.

    static func getFBEvents() {

    let graphRequest : GraphRequest = GraphRequest(graphPath: "/me", parameters: ["fields":"id, events"], httpMethod: .get)
        graphRequest.start(completionHandler: { (connection, result, error) -> Void in

        if error != nil {
        }
        else {

            if let dictionary = result as? [String: Any] {
            if let dictionary1 = dictionary["events"] as? [String: Any]{
                if let dataList = dictionary1["data"] as? [[String: Any]] {
                   dataList.forEach { dictionary in
                       let eventDescription = dictionary["description"] as? String
                       let fbEventId = dictionary["id"] as? String
                       let eventName = dictionary["name"] as? String
                       let eventStart = dictionary["start_time"] as? String

                        if let nestedDictionary = dictionary["place"] as? [String: Any] {
                            let eventLocation = nestedDictionary["name"] as? String

                //Get a Firebase reference
                let db = Firestore.firestore()
                db.collection("events").getDocuments() { (querySnapshot, err) in

                    if let err = err {
                        return
                    }
                    else {
                        for doc in querySnapshot!.documents {
                             let e = Event(snapshot: doc)

                            print("fb eventId: \(e?.fbEventId) & \(fbEventId)")

                            if e!.fbEventId != fbEventId {
                                print("event does not already exists, writing event to Firestore")
                            let newDocument = Firestore.firestore().collection("events").document()

                            //Create a dictionary for the event
                            let eventData = ["eventDescription":eventDescription, "eventStart":eventStart,"fbEventId": fbEventId, "eventCreated": Timestamp(date: Date()), "eventId": newDocument.documentID, "eventName": eventName, "eventSource": "FB", "eventLocation": eventLocation] as [String : Any]

                            //Create the profile for the event
                            newDocument.setData(eventData) { (error) in

                            if error != nil {
                            }
                            else {
                            }
                            }//close Firestore setData
                            }
                            else {
                                return
                            }
                        }
                    }
                }//close retrieve events
                }//close nested Dictionfary for place
                }//close datalist for each
                }//close datalist
            }//close dictionary1
            }//close dictionary
        }//close else
    }//close graph request start
)}//close getFBEvents
}

1 Ответ

1 голос
/ 22 октября 2019

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

По сути, я посчитал результаты в снимке из запроса get Firestore, чтобы увидеть, существует ли уже этот fbEventId, если не янаписал новое событие FB, если оно уже существовало, я вернулся.

  static func getFBEvents() {

    let graphRequest : GraphRequest = GraphRequest(graphPath: "/me", parameters: ["fields":"id, events"], httpMethod: .get)

        graphRequest.start(completionHandler: { (connection, result, error) -> Void in

        if error != nil {
            print("Error took place: \(String(describing: error))")
        }
        else {

            print("Print entire fetched result for events: \(String(describing: result))")

            if let dictionary = result as? [String: Any] {
            if let dictionary1 = dictionary["events"] as? [String: Any]{
                if let dataList = dictionary1["data"] as? [[String: Any]] {
                   dataList.forEach { dictionary in
                       let eventDescription = dictionary["description"] as? String
                       let fbEventId = dictionary["id"] as? String
                       let eventName = dictionary["name"] as? String
                       let eventStart = dictionary["start_time"] as? String

                        if let nestedDictionary = dictionary["place"] as? [String: Any] {

                            let eventLocation = nestedDictionary["name"] as? String

                //Get a Firebase reference
                let db = Firestore.firestore()
                            db.collection("events").whereField("fbEventId", isEqualTo: fbEventId!).getDocuments() { (querySnapshot, err) in

                    let size = querySnapshot?.count

                    if let err = err {
                        print("Error \(err)")
                        return
                    }

                    //If size of snapshot is equal to 0, FB event doesn't exist in user event collection so write fb event
                    else {

                            if size! == 0 {
                                print("event does not already exists, writing event to Firestore")
                            let newDocument = Firestore.firestore().collection("events").document()

                            //Create a dictionary for the event
                            let eventData = ["eventDescription":eventDescription, "eventStart":eventStart,"fbEventId": fbEventId, "eventCreated": Timestamp(date: Date()), "eventId": newDocument.documentID, "eventName": eventName, "eventSource": "FB", "eventLocation": eventLocation] as [String : Any]

                            //Create the profile for the event
                            newDocument.setData(eventData) { (error) in

                            if error != nil {
                                print("There was an error")
                            }
                            else {
                            }
                            }//close Firestore setData
                            }
                            else {
                                print("event already exists")
                                  //Get a Firebase reference
                                return
                            } 
                    }}}}}}}}})}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...