У меня есть приложение, которое направляет маршрут между местоположением пользователя и маркером. Он работает нормально, но если пользователь меняет свое местоположение и нажимает на другой маркер, маршрут выбирается из первого места.Обновить местоположение пользователя с помощью кнопки и нарисовать маршрут 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;
}