2016-11-24 2 views
0

MapView에서 두 개의 주석을 표시하려고합니다.두 번째 MKPointAnnotation이 표시되지 않는 이유는 무엇입니까?

두 번째 주석이 MapView에 표시되지 않는 이유는 무엇입니까? 아이콘 [0]을 장소 표시로 변경하려고했으나 [1] 아무런 도움이되지 않았습니다.

나는 for 절을 사용할 수 있었지만 테스트를 위해 코드를 반복했다.

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 개의 주소로 이미 테스트했습니다. 지오 코드는 주소의 1/5을 해결하지 못했습니다. 이것은 이유를 설명합니다. 지오 코드가 주소를 "알지 못했다"고 생각했지만 아마 속도 제한 때문일 것입니다. 완료 핸들러에서 오류 메시지를 표시하지 않았습니다. – Erva

관련 문제