Как установить свойства в закрытии / блоке в Swift
В настоящее время у меня есть два поля / свойства в моем контроллере представления. Мы используем calculateDirectionsWithCompletionHandler
и пытается установить мои поля в значение route.distance
а также route.expectedTravelTime
, Вот код для этого:
func calculateDistanceAndEta(locationCoordinate: CLLocationCoordinate2D) {
let currentLocMapItem = MKMapItem.mapItemForCurrentLocation();
let selectedPlacemark = MKPlacemark(coordinate: locationCoordinate, addressDictionary: nil);
let selectedMapItem = MKMapItem(placemark: selectedPlacemark);
let mapItems = [currentLocMapItem, selectedMapItem];
let request: MKDirectionsRequest = MKDirectionsRequest()
request.transportType = MKDirectionsTransportType.Walking;
request.setSource(currentLocMapItem)
request.setDestination(selectedMapItem);
var directions: MKDirections = MKDirections(request: request);
var distsanceLabelTest = ""
var etaLabelTest = ""
directions.calculateDirectionsWithCompletionHandler { (response, error) -> Void in
if (error == nil) {
if (response.routes.count > 0) {
var route: MKRoute = response.routes[0] as! MKRoute;
// route.distance = distance
// route.expectedTravelTime = eta
println("\(route.distance)")
distsanceLabelTest = "\(route.distance)"
etaLabelTest = "\(route.expectedTravelTime)"
}
} else {
println(error)
}
}
println(distsanceLabelTest)
println(etaLabelTest)
self.distanceLabelString = distsanceLabelTest
self.etaLabelString = etaLabelTest
}
Тем не менее, мы не можем установить ни одну из переменных, поскольку она просто возвращает nil
, Как мы устанавливаем поля нашего класса в значения route.distance
а также route.expectedTravelTime
,
1 ответ
мы не можем установить ни одну из переменных, поскольку она просто возвращает ноль.
Смысл предоставления блока завершения состоит в том, что calculateDirectionsWithCompletionHandler
работает асинхронно и выполняет процедуру завершения, когда она будет готова. Так что ваши distance
а также expectedTravelTime
свойства действительно будут неизменными сразу после calculateDistanceAndEta
возвращается, потому что процесс, начатый calculateDirectionsWithCompletionHandler
возможно, не закончил к тому времени. Ваш блок завершения будет запущен, когда он закончится. Если вам нужно выполнить какое-то действие, когда свойства установлены, поместите этот код в свой блок завершения.