geocodeAddressString не работает для быстрого

Привет, я пытаюсь использовать geocodeAddressString для преобразования адреса в метку на карте, но какой бы адрес я ни передал этому методу, приведенный ниже блок никогда не будет выполнен, может ли кто-нибудь просветить меня? Спасибо большое. Кстати, на конколе я вижу "до" и "после", но без "привет"

  let geo = CLGeocoder()
    print("before")
    geo.geocodeAddressString(("4 Bradford St, Perth WA 6050"), completionHandler: {
        (placemarks, error) -> Void in

        print ("hello")
        if let placemark = placemarks?[0]
       {
          self.mapView.addAnnotation(MKPlacemark(placemark: placemark))
        }
    })

  print ("after")

person Paddy Wang    schedule 14.07.2017    source источник
comment
Значит, ты никогда не видишь привет? И вы уверены, что добираетесь до этой строки geocodeAddressString?   -  person Rob    schedule 14.07.2017
comment
да, после этого звонка ставлю print(bye), может успешно распечатать, так странно   -  person Paddy Wang    schedule 15.07.2017
comment
Вы должны создать воспроизводимый пример проблемы (т. е. пустой проект, который ничего не делает, кроме воспроизведения этого конкретного поведения). Я не могу воспроизвести вашу проблему. И если мы не сможем воспроизвести проблему, мы не сможем помочь вам ее решить.   -  person Rob    schedule 15.07.2017
comment
Кстати, это не игровая площадка или приложение командной строки, верно? Это в реальном проекте iOS? Какая версия? Я подумал, что у вас может возникнуть эта проблема, если geo выпадет из области видимости, но похоже, что geocodeAddressString поддерживает геокодер в рабочем состоянии до тех пор, пока запрос не завершится. И даже если бы у вас было несколько вызовов cancelGeocode() где-то еще в вашем коде, вы, по крайней мере, увидели бы приветственное сообщение.   -  person Rob    schedule 15.07.2017
comment
Большое спасибо, Роб, да, это на самом деле проект, и, наконец, я понял причину, последовательность распечатки: до, после, привет. Я думаю, причина в том, что дескриптор называется обработчиком завершения? так что он срабатывает только после завершения всего метода? Кстати, я поместил этот кусок кода в метод viewDidload().   -  person Paddy Wang    schedule 15.07.2017
comment
Да, он вызывается асинхронно (т.е. позже). В своем вопросе вы сказали, что его никогда не вызывали. Но если вы говорите, что это на самом деле называется, только позже, то это именно так, как и ожидалось. Это очень распространенный паттерн, когда медленные процессы принимают параметр, являющийся замыканием, которое вызывается, когда позже завершается асинхронный процесс.   -  person Rob    schedule 15.07.2017
comment
Просто хотел поделиться, основываясь на недавнем личном опыте, что вы можете получить разные результаты для одного и того же ввода в разных странах. Это связано с тем, что при вызове без входного параметра региона для информирования результатов используется местоположение устройства. Кроме того, кажется, что есть какое-то максимальное расстояние, которое он вам предоставит. Например: ввод 55101 (почтовый индекс США) в Индии не дает результатов, тогда как в США он дает ожидаемые результаты. Я не нашел обходного пути для этого, поэтому этот API, похоже, не так хорош, как эквивалентный сервис Google.   -  person TahoeWolverine    schedule 21.06.2019


Ответы (3)


Использовать этот

import CoreLocation

let address = "1 Infinite Loop, CA, USA"
let geocoder = CLGeocoder()

geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
   if((error) != nil){
      print("Error", error)
   }
   if let placemark = placemarks?.first {
      let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
      }
    })
person BHAVIK PANCHAL    schedule 15.07.2017

Попробуйте этот код:

geocoder.geocodeAddressString(("4 Bradford St, Perth WA 6050"), completionHandler: {(placemarks, error) -> Void in

                    if let placemark = placemarks?.first {
                        let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
                        coordinates.latitude
                        coordinates.longitude


                        self.lat = coordinates.latitude
                        self.long = coordinates.longitude
                        print("lat \(self.lat)")
                        print("long \(self.long)")
                    }
                })
person sabari vasagan    schedule 14.07.2017
comment
до сих пор нет результата :( - person Paddy Wang; 15.07.2017
comment
Ok! не могли бы вы отправить свой образец вывода? - person sabari vasagan; 22.07.2017

Использовать этот

    import CoreLocation

    let address = "4 Bradford St, Perth WA 6050"
    let geocoder = CLGeocoder()

    geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
       if((error) != nil){
          print("Error", error)
       }
       if let placemark = placemarks?.first {
          let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
          }
        })


var address = "4 Bradford St, Perth WA 6050"
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(address, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
    if let placemark = placemarks?[0] as? CLPlacemark {
        self.mapView.addAnnotation(MKPlacemark(placemark: placemark))
    }
})
person BHAVIK PANCHAL    schedule 15.07.2017