2015-11-28 2 views
1

Мое приложение (1) получает местоположение пользователя, затем (2) анализирует XML на основе данных местоположения. От загрузки приложение отлично работает. Но я хотел бы получить обновленный XML, основанный на изменении местоположения, когда пользователь удаляет кнопку обновления. Я пробовал несколько версий этого, но не могу работать. Я включил часть моего кода, который, по моему мнению, имеет отношение к этому вопросу (я думаю, что это вопрос времени). На нажав кнопку обновления, обновления местоположения, но загружается старый XML:Обновление, затем выполняется NSXMLParser

class Myclass: UIPageViewController, UIPageViewControllerDataSource, CLLocationManagerDelegate, NSXMLParserDelegate { 

    let locationManager = CLLocationManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.dataSource = self 
    locationManager.delegate = self 

    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters 
    locationManager.requestWhenInUseAuthorization() 
    //locationManager.requestLocation() 

} 

override func viewWillAppear(animated: Bool) { 
    switch CLLocationManager.authorizationStatus() { 
    case .AuthorizedWhenInUse, .AuthorizedAlways: 
     busyAlertController.display() 
     locationManager.requestLocation() 
     print("Authorized") 
    case .NotDetermined: 
     locationManager.requestWhenInUseAuthorization() // or request always if you need it 
     print("Not Determined") 
    case .Restricted, .Denied: 
     print("Restricted or Denied") 
     self.dismissViewControllerAnimated(true, completion: nil) 
     let alertController = UIAlertController(
      title: "Background Location Access Disabled", 
      message: "We need to know your location to show you the correct forecast, please open this app's settings and set location access to 'When in Use' or 'Always'.", 
      preferredStyle: .Alert) 

     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
     alertController.addAction(cancelAction) 

     let openAction = UIAlertAction(title: "Open Settings", style: .Default) { (action) in 
      if let url = NSURL(string:UIApplicationOpenSettingsURLString) { 
       UIApplication.sharedApplication().openURL(url) 
      } 
     } 
     alertController.addAction(openAction) 

     self.presentViewController(alertController, animated: true, completion: nil) 
    } 

} 

// MARK: UIPageViewControllerDataSource & UIPageViewControllerDelegate 

// MARK: - CLLocationManagerDelegate 

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if (status == .AuthorizedAlways) || (status == .AuthorizedWhenInUse) { 
     locationManager.requestLocation() 
    } 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let location = locations.first { 


     let lat = "\(location.coordinate.latitude)" 
     let lon = "\(location.coordinate.longitude)" 


     let url = baseURL + lat + "&lon=" + lon + suffixURL 

     guard let urlAsNSURL = NSURL(string: url) else {return} 
     NWSURL = urlAsNSURL 
     runParser() 


    } else { 

     //TODO: 

    } 
} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 

    print("Error finding location: \(error.localizedDescription)") 

    showAlert("Location Problem", message: "We're having trouble finding your location, please try again.") 
} 

//XMLParser Methods 


func parserDidEndDocument(parser: NSXMLParser){ 

    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.showVC() 
    }) 
} 


func runParser() { 
    guard let url = URL else { 

     return} 
    guard let parser = NSXMLParser(contentsOfURL: url) else {return} 
    parser.delegate = self 
    parser.parse() 
} 


@IBAction func refresh(sender: UIBarButtonItem) { 
    locationManager.requestLocation() 
    //runParser() 
} 

}

ответ

0

Проблема заключалась в том, что я не убирая переменный (array) после того, как NSXMLParser было сделано, и поэтому я был добавления над устаревшими данными, но так как устаревшие данные были сначала показывали в моем UI и сделал это ОЧЕНЬ трудно обнаружить проблему, пока я не напечатал на консоли и не увидел несколько массивов. Я сделал что-то подобное перед запиской всем, кто внедряет NSXMLParser: убедитесь, что вы очистите переменную, которую используете для хранения данных, в didEndElement.

1

locations массив, который был принят в locationManager:didUpdateLocations: может содержать более одного места в обновления случае были отложены или несколько мест прибыл, прежде чем они могли быть доставлены.

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

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let location = locations.last { 
    ... 
    } 
} 
+0

Это отличный момент и абсолютно верно (я быстро написал эту строку и забыл вернуться к ней). Однако это не моя проблема ... см. Мой ответ ниже. Тем не менее, спасибо за вклад! – GarySabo