Аннотации на карте View не отображаются сразу - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу отобразить около 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) статью, чтобы помочь мне понять это?

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

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

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")
}

}

0 голосов
/ 26 февраля 2020

iOS управляет этим так. Он хочет не иметь MapView с большим количеством Annotations, наложенных друг на друга. Таким образом, это расставляет приоритеты контактов и показывает контакты с более высоким приоритетом.

Тогда, когда вы zoom на экране, будут показаны другие контакты.

В представлении карты сначала не отображаются все аннотации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...