аннотация swift 4 из json не видна, пока пользователь не перетаскивает карту

#ios #swift #mapkit #mapkitannotation

#iOS #swift #mapkit #mapkitannotation

Вопрос:

У меня возникают проблемы с отображением аннотаций на карте. Они отображаются только при перемещении или перетаскивании карты.

Я пытался следовать руководству на YouTube, а также одному из вопросов, который является c sharp

Пожалуйста, может ли кто-нибудь помочь.. вот код

Здесь я создал класс для аннотации

   class customPin: NSObject, MKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var title: String?
    var subtitle: String?

    init(pinTitle:String, pinSubTitle:String, location:CLLocationCoordinate2D) {
        self.title = pinTitle
        self.subtitle = pinSubTitle
        self.coordinate = location
    }}

    class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!

     var locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

        self.locationManager.requestWhenInUseAuthorization()


        //json show the list of the parks


pipiCanList()

     //show location Barcelona
    let location = CLLocationCoordinate2D(latitude: 41.3851   , longitude:2.1734)
    let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))

    self.mapView.setRegion(region, animated: true)
    self.mapView.delegate = self
  

}

получить информацию в формате json

  func pipiCanList(){

        let url = "http://bluewave.lk/Apps/pipiCan/Api/read.php";
        let urlObj = URL(string:url);

        URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
            do{
                let pipiCans = try JSONDecoder().decode([pipiCanDBList].self, from: data!)

                for pipiCan in pipiCans{

                    let Latitude = (pipiCan.ParkLatitude! as NSString).doubleValue
                    let Longitude = (pipiCan.ParkLongitude! as NSString).doubleValue
                    let  location = CLLocationCoordinate2D(latitude: Latitude, longitude: Longitude)

                    //add to
                    let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location:  location)
                    self.mapView.addAnnotation(pin)

                  }
            } catch{

                print ("Error - cannot get list")

            }
            }.resume()


    }
}    
  

Ответ №1:

Вам нужно

 DispatchQueue.main.async { 
    let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location:  location)
    self.mapView.addAnnotation(pin)
}
  

Поскольку URLSession.shared.dataTask обратный вызов выполняется в фоновом потоке, и вы должны получить доступ к элементам UIKit, подобным mapView элементам основного потока, вы также можете сделать

 self.mapView.showAnnotations(self.mapView.annotations, animated: true)
  

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

  let location = CLLocationCoordinate2D(latitude: 41.3851   , longitude:2.1734)
let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
  

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

Комментарии:

1. Спасибо Sh_Kahn за ваш быстрый ответ. DispatchQueue.main.async сработал. Большое спасибо