2017-03-10 23 views
1

我試圖用地理編碼器geocodeAddressString-function將多個批註添加到我的mapview。使用geocoder.geocodeAddressString添加多個批註(遞歸?)

問題是,它只是添加其中的一個,但是它告訴我,兩個都運行.. 這是我的代碼 - 順便說一句,我從來沒有真正使用遞歸之前,所以請糾正我,這一切都做錯了! :)

func geoCode(addresses: [String]) { 
    print("Addresser: \(addresses.count)") 

    guard let address = addresses.first else { 
     print("No more adresses :) - returning") 
     return 
    } 
    print("3333 address: \(address)") 
    dispatch_async(dispatch_get_main_queue()) { 
     self.geocoder.geocodeAddressString(address) { (placemarks, error) in 
      print("In geocoder!") 
      if error == nil { 
       if let placemark = (placemarks?[0])! as? CLPlacemark { 
        self.annotation.coordinate = CLLocationCoordinate2DMake((placemark.location?.coordinate.latitude)!, (placemark.location?.coordinate.longitude)!) 
        self.map.addAnnotation(self.annotation) 

        let remainingAddresses = Array(addresses[1..<addresses.count]) 
        print("addresses left: \(remainingAddresses.count)") 
        self.geoCode(remainingAddresses) 
       } 
      } 
     } 
    } 

} 

這裏是我的控制檯輸出:

Addresser: 2 
3333 address: Kastrupvej 2A 2300 København s 
In geocoder! 
addresses left: 1 
Addresser: 1 
3333 address: Holmbladsgade 20 2300 København S 
In geocoder! 
addresses left: 0 
Addresser: 0 
No more adresses :) - returning 

但只有1註記在我的地圖,這是最後一個.. 誰能告訴我爲什麼,我在做什麼錯? :) 我試着用for-loop第一次,但似乎地理編碼器只能處理1件事 - 這就是爲什麼我嘗試了異步和遞歸方式。

祝您有美好的一天!

回答

0
  • 嘗試每次分配geoCoder。
  • 調用geocoder.cancelGeocode()方法。

像這樣:

func geoCode(addresses: [String]) { 
    print("Addresser: \(addresses.count)") 

    guard let address = addresses.first else { 
     print("No more adresses :) - returning") 
     return 
    } 
    print("3333 address: \(address)") 
    dispatch_async(dispatch_get_main_queue()) { 
     let geocoder = CLGeocoder() 
     geocoder.geocodeAddressString(address) { (placemarks, error) in 
      print("In geocoder!") 
      if error == nil { 
       if let placemark = (placemarks?[0])! as? CLPlacemark { 
        self.annotation.coordinate = CLLocationCoordinate2DMake((placemark.location?.coordinate.latitude)!, (placemark.location?.coordinate.longitude)!) 
        self.map.addAnnotation(self.annotation) 

        let remainingAddresses = Array(addresses[1..<addresses.count]) 
        print("addresses left: \(remainingAddresses.count)") 
        self.geoCode(remainingAddresses) 
       } 
       geocoder.cancelGeocode() 
      } 
     } 
    } 

}