Обработчик завершения вызывается только в том случае, если он не был вызван ранее

Мое приложение получает обновления местоположения, и когда это происходит (если они актуальны), я асинхронно вызываю API с помощью обработчика завершения. Когда приложение открывается, обработчик завершения отвечает только в том случае, если до этого не было завершенного запроса (обычно два запроса приходят одновременно). Когда я отлаживаю, после первых 2-3 запросов (которые приходят одновременно), когда все работает, когда обновление местоположения проходит как актуальное, вся часть кода обработки завершения пропускается.

Вот как я вызываю обработчик завершения:

        if conditions {
            let lat = Float(loc.lat)
            let long =  Float(loc.long)
            // calls function using completion handler in order to add new location
            BusStations.allBusStations(lat: lat, long: long) { (busStations, error) in
                if let error = error {
                    // got an error in getting the data
                    print(error)
                    return
                }
                guard let busStations = busStations else {
                    print("error getting all: result is nil")
                    return
                }
                if !busStations.stops.isEmpty || self.locations.isEmpty {
                    // do stuff
                }
            }
        }

Вот как я делаю вызов API:

    static func allBusStations (lat: Float, long: Float, completionHandler: @escaping (BusStations?, Error?) -> Void) {
        let endpoint = BusStations.endpointForBusStations(lat: lat, long: long)
        guard let url = URL(string: endpoint) else {
            print("Error: cannot create URL")
            let error = BackendError.urlError(reason: "Could not construct URL")
            completionHandler(nil, error)
            return
        }
        let urlRequest = URLRequest(url: url)
        let session = URLSession.shared

        let task = session.dataTask(with: urlRequest) {
            (data, response, error) in
            guard let responseData = data else {
                print("Error: did not receive data")
                completionHandler(nil, error)
                return
            }
            guard error == nil else {
                completionHandler(nil, error)
                return
            }

            let decoder = JSONDecoder()
            do {
                let stations = try decoder.decode(BusStations.self, from: responseData)
                completionHandler(stations, nil)
            } catch {
                print("error trying to convert data to JSON")
                print(error)
                completionHandler(nil, error)
            }
        }
        task.resume()
    }

Что я делаю не так? Любая помощь будет оценена по достоинству.


person Ioana Surdu Bob    schedule 14.02.2018    source источник
comment
Возвращаются ли данные, когда обновление местоположения проходит как релевантное?   -  person John D    schedule 15.02.2018
comment
не из обработчика завершения. Отладчик проникает внутрь if, назначает широту и долготу, а затем просто пропускает весь вызов allBusStations.   -  person Ioana Surdu Bob    schedule 15.02.2018
comment
Если никто не ответит в ближайшее время, я бы предложил сделать небольшой минимальный проект, в котором воспроизводится эта проблема, и загрузить его на Github. Имея это в руках, было бы намного легче выяснить причину. Для меня это больше похоже на проблему управления памятью.   -  person Yevhen Dubinin    schedule 16.02.2018
comment
Я попытался отладить его снова, и теперь он вошел в обработчик завершения. Понятия не имею почему. Я ничего не менял в коде, что могло бы на это повлиять. Что я должен делать? удалить вопрос?   -  person Ioana Surdu Bob    schedule 16.02.2018


Ответы (1)


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

person Ron Liu    schedule 15.02.2018