Итак, я пытаюсь реструктурировать свои вызовы API, чтобы использовать dispatchGroups, чтобы мне не приходилось так быстро перезагружать collectionViews и другие элементы. Я знаю, что с группами рассылки вам обычно нужно создать одну, войти, а затем выйти определенное количество раз. По завершении этого вы обычно уведомляете основную очередь о необходимости выполнения какой-либо операции. Однако в приведенном ниже фрагменте кода он уведомляет основную очередь еще до того, как я вхожу в группу рассылки один раз. Который бросает вещи далеко. Если бы кто-нибудь мог посмотреть на мой код и сказать, что происходит не так, я был бы очень признателен.
static func showFeaturedEvent(for currentLocation: CLLocation,completion: @escaping ([Event]) -> Void) {
//getting firebase root directory
let dispatchGroup1 = DispatchGroup()
var currentEvents:[Event]?
var geoFireRef: DatabaseReference?
var geoFire:GeoFire?
geoFireRef = Database.database().reference().child("featuredeventsbylocation")
geoFire = GeoFire(firebaseRef: geoFireRef!)
let circleQuery = geoFire?.query(at: currentLocation, withRadius: 17.0)
circleQuery?.observe(.keyEntered, with: { (key: String!, location: CLLocation!) in
print("Key '\(key)' entered the search area and is at location '\(location)'")
dispatchGroup1.enter()
print("entered dispatch group")
EventService.show(forEventKey: key, completion: { (event) in
if let newEvent = event {
currentEvents?.append(newEvent)
dispatchGroup1.leave()
print("left dispatch group")
}
})
})
dispatchGroup1.notify(queue: .main, execute: {
if let currentEventsFinal = currentEvents{
completion(currentEventsFinal)
}
})
}
Я управляю группами рассылки в других местах. Я не уверен, повлияет ли это на что-нибудь, но я просто чувствовал, что важно отметить этот вопрос.