Как установить свойства в закрытии / блоке в 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 возможно, не закончил к тому времени. Ваш блок завершения будет запущен, когда он закончится. Если вам нужно выполнить какое-то действие, когда свойства установлены, поместите этот код в свой блок завершения.

Другие вопросы по тегам