Я хочу отобразить около 600 комментариев на основе координат, которые я декодирую с JSON. Я вызываю следующий код, чтобы определить и добавить аннотации (он вызывается функцией в viewDidLoad (), я не показал код API, но я знаю, что он работает). Все аннотации определены правильно, однако, когда появляется исходная карта, аннотации не отображаются. Они отображаются только когда я панорамирую карту или увеличиваю масштаб. Я хотел бы показать их, когда карта открывается изначально, что мне не хватает?
session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) in
if let data = data
{
do {
let result = try JSONDecoder().decode(TideStations.self, from: data)
self.tideStations = result.stations
print("\(result.stations.count) Tide Stations successfully loaded")
for station in self.tideStations {
let annotation = MKPointAnnotation()
annotation.title = station.properties.name
let lattitude = CLLocationDegrees(station.geometry.coordinates[1])
let longitude = CLLocationDegrees(station.geometry.coordinates[0])
annotation.coordinate = CLLocationCoordinate2D(latitude: lattitude, longitude: longitude)
self.mapView.addAnnotation(annotation)
}
} catch {
print("Error while stations parsing: \(error)")
}
}
}).resume()
Обновление 1:
Я почти уверен, что проблема связана с упорядочением и возможно асинхронный характер вызова API, который я делаю. Может ли быть так, что карта отображается, тогда в viewDidLoad () вызывается API для поиска данных аннотации и сделанных аннотаций - однако карта не обновляется аннотациями до тех пор, пока я не перемещу или не увеличу масштаб?
Обновить 2:
Проведя гораздо больше копаний, я подтвердил, что проблема связана с моим отсутствием понимания асинхронной обработки. Я добавил следующий код в функцию, которая добавляет аннотации к карте:
func showTideStationsOnMap() -> Void {
if tideStations.count > 0 {
for station in self.tideStations {
let annotation = MKPointAnnotation()
annotation.title = station.properties.name
let lattitude = CLLocationDegrees(station.geometry.coordinates[1])
let longitude = CLLocationDegrees(station.geometry.coordinates[0])
annotation.coordinate = CLLocationCoordinate2D(latitude: lattitude, longitude: longitude)
DispatchQueue.main.async {
self.mapView.addAnnotation(annotation)
}
}
} else {
print("No tide stations to show")
}
}
DispatchQue.main.asyn c решает проблему, я полагаю, перенося чертеж из фоновой задачи в переднее задание. Мои знания асин c процессов еще невелики. Кто-нибудь может порекомендовать хорошую (для новичка ie) статью, чтобы помочь мне понять это?