2016-11-24 97 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

相關問題