Мое приложение получает обновления местоположения, и когда это происходит (если они актуальны), я асинхронно вызываю 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()
}
Что я делаю не так? Любая помощь будет оценена по достоинству.