2016-11-24 70 views
0

我试图在MapView中显示两个注释。为什么第二个MKPointAnnotation不显示?

为什么第二个注释不显示在MapView中?我试图改变地标[0]来放置标记[1],但没有任何帮助。

我可以用于子句,但为了测试我重复了代码。

class Asiakas { 
    var nimi = "" 
    var osoite = "" 

    init(nimi: String, osoite: String) { 
     self.nimi = nimi 
     self.osoite = osoite 
    } 
} 


class ViewController: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 

    var asiakkaat:[Asiakas] = [ 
     Asiakas(nimi: "Testi Asiakas", osoite: "Museokatu 10, helsinki"), 
     Asiakas(nimi: "Hyvä asiakas", osoite: "Pihlajatie 17, helsinki") 
    ] 

    var asiakas:Asiakas! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     let geoCoder = CLGeocoder() 

     geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in 
      if error != nil { 
       print(error) 
       return 
      } 

      if let placemarks = placemarks { 
       let placemark = placemarks[0] 

       let annotation = MKPointAnnotation() 
       if let location = placemark.location { 
        annotation.coordinate = location.coordinate 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     }) 

     geoCoder.geocodeAddressString(asiakkaat[1].osoite, completionHandler: { placemarks, error in 
      if error != nil { 
       print(error) 
       return 
      } 

      if let placemarks = placemarks { 
       let placemark = placemarks[0] 

       let annotation = MKPointAnnotation() 
       if let location = placemark.location { 
        annotation.coordinate = location.coordinate 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     }) 

    } 

回答

0

您不能同时对地理编码服务进行多个呼叫。

geocodeAddressString(_ addressString: String, completionHandler: CoreLocation.CLGeocodeCompletionHandler)文档:

提交使用指定字符串的正向地址解析请求。该方法以异步方式将指定的位置数据提交给地理编码服务器 并返回。您的完成处理程序块将在主线程上执行 。 发起前向地理编码 请求后,请勿尝试启动另一个前向或 反向地理编码请求。

因此,您需要在第一次调用完成后进行第二次调用。

如果你这样做,你会得到正确的结果:

let geoCoder = CLGeocoder() 

geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in 
    if error != nil { 
     print(error) 
     return 
    } 

    geoCoder.geocodeAddressString(self.asiakkaat[1].osoite, completionHandler: { placemarks, error in 
     if error != nil { 
      print(error) 
      return 
     } 

     if let placemarks = placemarks { 
      let placemark = placemarks[0] 

      let annotation = MKPointAnnotation() 
      if let location = placemark.location { 
       annotation.coordinate = location.coordinate 
       self.mapView.addAnnotation(annotation) 
      } 
     } 
    }) 

    if let placemarks = placemarks { 
     let placemark = placemarks[0] 

     let annotation = MKPointAnnotation() 
     if let location = placemark.location { 
      annotation.coordinate = location.coordinate 
      self.mapView.addAnnotation(annotation) 
     } 
    } 
}) 
+0

好,感谢您的回答。我可能会把geoCode放到它自己的函数中,并从viewDidLoad函数调用它。会有大约100个注释。 – Erva

+0

@Erva意识到地理编码有一个速率限制。 来自文档'应用程序应该意识到他们如何使用地理编码。地理编码请求对每个应用都是速率限制的,因此在短时间内请求太多可能会导致某些请求失败。 (当超过最大速率时,地理编码器将带有网络值的错误对象返回给关联的完成处理程序。)' –

+0

我已经在for子句中测试了大约100个地址。 Geocode没有解决大约1/5的地址。这解释了原因。我认为地址代码并不“知道”地址,但可能是因为费率限制。完成处理程序没有给出任何错误消息。 – Erva

相关问题