2016-09-03 7 views
0

У меня есть приложение, которое направляет маршрут между местоположением пользователя и маркером. Он работает нормально, но если пользователь меняет свое местоположение и нажимает на другой маркер, маршрут выбирается из первого места.Обновить местоположение пользователя с помощью кнопки и нарисовать маршрут swift

Это была логика. Функция locationManager останавливала место обновления, чтобы сохранить батарею. Это был код:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    userLocation = locations[0] 
    long = userLocation.coordinate.longitude; 
    lat = userLocation.coordinate.latitude; 
    locationManager.stopUpdatingLocation() 

    if let location = locations.first { 

     mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 14, bearing: 0, viewingAngle: 0) 
     } 
} 

Затем я создаю кнопку, чтобы обновить местоположение пользователя и перерисовки полилинию:

@IBAction func ActualizarLocalizacion(sender: AnyObject) { 
    locationManager.startUpdatingLocation() 

    originAddresslong = "\(userLocation.coordinate.longitude)" 
    originAddresslat = "\(userLocation.coordinate.latitude)" 

    if markerLocation == nil 
    {markerLocation = userLocation.coordinate 
    } 

    destinationAddresslong = "\(markerLocation.longitude)" 
    destinationAddresslat = "\(markerLocation.latitude)" 


    var directionsURLString = baseURLDirections + "origin=" + originAddresslat + "," + originAddresslong + "&destination=" + destinationAddresslat + "," + destinationAddresslong + "&key=MyKey" 
    directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    let directionsURL = NSURL(string: directionsURLString) 


    Alamofire.request(.GET, directionsURL!, parameters: nil).responseJSON { response in 

     switch response.result { 

     case .Success(let data): 

      var json = JSON(data) 
      print(json) 

      let errornum = json["error"] 


      if (errornum == true){ 



      }else{ 

       //NSThread.sleepForTimeInterval (2) 

       var routes = json["routes"].array 

       if routes != nil{ 

        var overViewPolyLine = routes![0]["overview_polyline"]["points"].string 
        print(overViewPolyLine) 
        if overViewPolyLine != nil{ 

         if self.routePolyline != nil { 
          self.routePolyline.map = nil 
          self.routePolyline = nil 
         } 


         let path = GMSMutablePath(fromEncodedPath: overViewPolyLine) 
         self.routePolyline = GMSPolyline(path: path) 
         self.routePolyline.strokeWidth = 5 
         self.routePolyline.strokeColor = UIColor.blueColor() 
         self.routePolyline.map = self.mapView 
         overViewPolyLine = nil 
         routes = nil 
         json = nil 

        } 

       } 
      } 
     case .Failure(let error): 

      print("Hubo un problema con el servidor de direcciones: \(error)") 
     } 

} 
} 

Я тогда вижу, что я должен нажать кнопку 3 раза (!!!) для правильной перерисовки. Я использовал код

locationManager.startUpdatingLocation() 

    NSThread.sleepForTimeInterval (2) 

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

Функция, которую я использую, когда пользователь нажимает маркер, одинаковый (формулы и переменные), и в этом случае ему нужно только одно нажатие.

Спасибо за все.

P.D:

Это мои импорт:

import UIKit 
import GoogleMaps 
import SRKUtility 
import SRKRequestManager 
import Alamofire 
import SwiftyJSON 

И это моя markerLocation переменная:

func mapView(mapView: GMSMapView!, didTapMarker marker: GMSMarker!) -> Bool { 

    markerLocation = marker.position; 
} 

ответ

1

Я получил его. Наконец, я отделил кнопку и код перерисовки, который был введен в диспетчере местоположений. Это последний код:

1- locationmanager FUNC locationManager (менеджер: CLLocationManager, didUpdateLocations места: [CLLocation]) {

userLocation = locations[0] 
    long = userLocation.coordinate.longitude; 
    lat = userLocation.coordinate.latitude; 

    originAddresslong = "\(userLocation.coordinate.longitude)" 
    originAddresslat = "\(userLocation.coordinate.latitude)" 

    if markerLocation == nil 
    {markerLocation = userLocation.coordinate 
    } 

    destinationAddresslong = "\(markerLocation.longitude)" 
    destinationAddresslat = "\(markerLocation.latitude)" 



    var directionsURLString = baseURLDirections + "origin=" + originAddresslat + "," + originAddresslong + "&destination=" + destinationAddresslat + "," + destinationAddresslong + "&key=AIzaSyB4xO_8B0ZoA8lsAgRjqpqJjgWHbb5X3u0" 
    directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    let directionsURL = NSURL(string: directionsURLString) 


    Alamofire.request(.GET, directionsURL!, parameters: nil).responseJSON { response in 

     switch response.result { 

     case .Success(let data): 

      var json = JSON(data) 
      print(json) 

      let errornum = json["error"] 


      if (errornum == true){ 



      }else{ 

       //NSThread.sleepForTimeInterval (2) 

       var routes = json["routes"].array 

       if routes != nil{ 

        var overViewPolyLine = routes![0]["overview_polyline"]["points"].string 
        let distancia = routes![0]["legs"][0]["distance"]["text"].string 
        if overViewPolyLine != nil{ 

         if self.routePolyline != nil { 
          self.routePolyline.map = nil 
          self.routePolyline = nil 
         } 


         let path = GMSMutablePath(fromEncodedPath: overViewPolyLine) 
         self.routePolyline = GMSPolyline(path: path) 
         self.routePolyline.strokeWidth = 5 
         self.routePolyline.strokeColor = UIColor.blueColor() 
         self.routePolyline.map = self.mapView 

         self.DistanciaLabel.setTitle(distancia,forState: UIControlState.Normal) 

         overViewPolyLine = nil 
         routes = nil 
         json = nil 

        } 

       } 
      } 
     case .Failure(let error): 

      print("Hubo un problema con el servidor de direcciones: \(error)") 
     } 

    } 

    locationManager.stopUpdatingLocation() 

    if let location = locations.first { 
     mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 14, bearing: 0, viewingAngle: 0) 

    } 

} 

2- Кнопка

@IBAction func ActualizarLocalizacion(sender: AnyObject) { 
    locationManager.startUpdatingLocation()  
     }