Ошибки группы рассылки - PullRequest
0 голосов
/ 02 мая 2018

Итак, я пытаюсь реструктурировать свои вызовы 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)
            }
        })
    }

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

1 Ответ

0 голосов
/ 02 мая 2018

Вам нужно enter группа перед запуском асинхронной задачи и leave при завершении асинхронной задачи. Вы не выполняете первую enter до тех пор, пока не завершится первая асинхронная задача, поэтому, когда выполнение достигает вашего notify, группа рассылки пуста и она запускается сразу.

Также важно, чтобы вы звонили leave столько раз, сколько вы звоните enter, иначе группа никогда не опустеет, поэтому будьте осторожны с вызовом leave внутри условных операторов.

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)

    disatchGroup1.enter()

    circleQuery?.observe(.keyEntered, with: { (key: String!, location: CLLocation!) in
        print("Key '\(key)' entered the search area and is at location '\(location)'")

        dispatchGroup1.enter()

        EventService.show(forEventKey: key, completion: { (event) in
            if let newEvent = event {
                currentEvents?.append(newEvent)
                print("left dispatch group")
            }

            dispatchGroup1.leave()

        })

        dispatchGroup1.leave()

    })

    dispatchGroup1.notify(queue: .main, execute: {
        if let currentEventsFinal = currentEvents{
            completion(currentEventsFinal)
        }
    })
}
...