2016-12-30 8 views
0

Я новичок в быстром и стараюсь рассчитать расстояние по маршруту от пользователяLocation до нескольких точек интереса.Подсчитайте каждое расстояние от пользователя до нескольких пунктов по маршруту в Swift

Я не хочу, чтобы в этой части приложения «нарисовать» маршрут на карте, но я хочу рассчитать расстояние по маршруту вместо расстояния между двумя координатами, а затем показать это расстояние как информацию внутри выноска на карте.

Координата POI (широта и долгота) содержится в базе данных.

Я прочитал некоторые темы об этом аргументе здесь на переполнение стека:

Measuring distance in meters from a drawn route in MKMapView

MKMapView get distance between coordinates on customized route

и другие обучающие программы:

http://www.technetexperts.com/mobile/draw-route-between-2-points-on-map-with-ios7-mapkit-api/ https://videos.raywenderlich.com/courses/mapkit-and-core-location/lessons/9

тогда я написал это код:

for item in items { 
if item.latitudine != "" && item.longitudine != "" { 

// Point Of Interest coordinate 
let latitude = Double(item.latitude!) 
let longitude = Double(item.longitude!) 
let itemLocation = CLLocation(latitude: latitude!, longitude: longitude!) 
let itemLocationPlacemark = MKPlacemark(coordinate: itemLocation.coordinate, addressDictionary: nil) 

// user coordinate 
let userLocation = CLLocation(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude) 
let userLocationPlacemark = MKPlacemark(coordinate: userLocation.coordinate, addressDictionary: nil) 

// create Request object 
let request = MKDirectionsRequest() 
request.source = MKMapItem(placemark: userLocationPlacemark) 
request.destination = MKMapItem(placemark: itemLocationPlacemark) 
request.requestsAlternateRoutes = false 
request.transportType = .automobile 


let directions = MKDirections(request: request) 
directions.calculate { 
[weak self] (response, error) in 
    if error == nil { 
     for route in (response?.routes)! { 
     let distance = (route.distance)/1000 
     print(distance)        
         } 
        } 
       } 
      } 
    } 

Проблема в том, что я выполняю код из строки directions.calculate.

Программа запускает линию, но затем не выполняет остальные функции, не выполняет управление if error == nil и инструкции в закрытии.

Итак, теперь я задаюсь вопросом, не ошибается ли моя идея, а если нет, как можно получить мою цель.

+0

Взгляните на этот учебник: https://www.devfright.com/mkdirections-tutorial/ Учебник содержит более подробную информацию по обработке результатов от запрос MKDirections –

+0

Большое спасибо за ваш ответ. Я постараюсь понять учебник, но я не знаю obj c –

+0

Нет проблем. Я тоже не говорю, но вызовы API могут быть очень полезны в качестве примеров –

ответ

0

(опубликовано решение от имени ОП).

Чтение других потоков. Я понимаю, что проблема заключалась в замыкании внутри цикла. Поэтому после нескольких попыток я нашел решение, которое работает для меня. Я пишу это здесь, так что может быть полезным для кого-то еще:

var counter: Int! 
... 

for item in itemPin { 

      if item.latitude != "" && item.longitude != "" { 
.... 
.... 
let directions = MKDirections(request: request) 
directions.calculate { 
        (response, error) in 
        print("error \(error)") 
        if error == nil { 
        counter = self.counter + 1 
         print(self.counter) 
         if self.counter >= self.itemPin.count { 
         let result = (response?.routes[0].distance)!/1000 
         } 
        } 
       } 
... 
     } 
} 
+1

благодаря @halfer за его вклад в создание readeable моего сообщения –

+0

Добро пожаловать, @Giuseppe! – halfer