Я пытаюсь проверить, существует ли уже событие 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
}