Как вызвать метод CLGeocoder синхронно - PullRequest
0 голосов
/ 03 марта 2019

У меня есть в коде ViewController

var location = CLLocation()
    DispatchQueue.global().sync {
        let objLocationManager = clsLocationManager()
        location = objLocationManager.findLocationByAddress(address: self.txtTo.stringValue)
    }
    lblToLatitude.stringValue = String(location.coordinate.latitude)
    lblToLongitude.stringValue = String(location.coordinate.longitude)

, вызывающий метод findLocationByAddress, который реализован в отдельном классе clsLocationManager, как это

func findLocationByAddress(address: String) -> CLLocation {
    let geoCoder = CLGeocoder()
    var location = CLLocation()
    geoCoder.geocodeAddressString(address, completionHandler: {(places, error) in
        guard error == nil else { return }
        location = places![0].location!
    })
    return location
}

Я пытаюсь обеспечить синхронизацию с помощью DispatchQueue.global ().что геокодирование выполняется перед передачей координат меткам lblToLatitude и lblToLongitude, но это не работает.Конечно, я мог бы выполнять геокодирование в коде ViewController, но мне интересно, как сохранить его в отдельном классе.

1 Ответ

0 голосов
/ 03 марта 2019

Вам нужно завершение

func findLocationByAddress(address: String,completion:@escaping((CLLocation?) -> ())) {
    let geoCoder = CLGeocoder() 
    geoCoder.geocodeAddressString(address, completionHandler: {(places, error) in
        guard error == nil else { completion(nil) ; return }
        completion(places![0].location!)
    }) 
}

для вызова

findLocationByAddress { (location) in 
  if let location = location { 
      lblToLatitude.stringValue = String(location.coordinate.latitude)
      lblToLongitude.stringValue = String(location.coordinate.longitude)
  } 
}

Также не требуется DispatchQueue.global().sync {, поскольку геокодер работает асинхронно в фоновом потоке

...