2015-02-23 2 views
1

Я реализую местоположение пользователя для IOS с помощью swift. Это мой код.Получение много обновлений местоположения

import UIKit 
import CoreLocation 

class localizationViewController: UIViewController, CLLocationManagerDelegate { 

    let locationManager = CLLocationManager() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     self.locationManager.delegate = self 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     self.locationManager.distanceFilter = 500 
     self.locationManager.requestWhenInUseAuthorization() 
     self.locationManager.startUpdatingLocation() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
     CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler: { (placemarks, error) -> Void in 

      if (error != nil) { 
       println("Error: " + error.localizedDescription) 
       return 
      } 

      if placemarks.count > 0 { 

       let pm = placemarks[0] as CLPlacemark 
       self.displayLocationInfo(pm) 
      } else { 
       println("Error with data") 
      } 
     }) 
    } 

    func displayLocationInfo(placemark: CLPlacemark) { 
     self.locationManager.stopUpdatingLocation() 

     var city = placemark.locality 
     var department = placemark.administrativeArea 
     var country = placemark.country 
     var latitude = placemark.location.coordinate.latitude 
     var longitude = placemark.location.coordinate.longitude 
     var date = placemark.location.timestamp 

     println(city) 
     println(department) 
     println(country) 
     println(latitude) 
     println(longitude) 
     println(date) 
    } 

    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
     println("Error: " + error.localizedDescription) 
    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 


    @IBAction func actionLocation(sender: UISwitch) { 
     println("get location request") 
    } 
} 

Я получаю информацию о местоположении должным образом, но всегда обновляется 3 или 4 раза. Я читал, что если вы установили distanceFilter, это остановится, но это не работает для меня. Как я могу настроить my didUpdateLocations для получения только одного места для запроса? Как я могу запустить эту функцию внутри элемента действия (переключатель или кнопка на пример)? Этот последний вопрос, потому что, может быть, причина в том, что всегда, по первому запросу местоположения, приложение не принимает vaules Accuary на дистанционный фильтр ... Thankyou.

ответ

1

Вы можете поместить self.locationManager.startUpdatingLocation() в свою actionLocation() функцию, чтобы она начала получать новые местоположения после нажатия кнопки.

distanceFilter - указать минимальное расстояние для обновления в метрах. Если вы установите значение 500, оно будет обновляться только каждые 500 метров. По умолчанию используется kCLDistanceFilterNone. Пройдите в kCLDistanceFilterNone, чтобы получать уведомления обо всех движениях.

Вы можете использовать значение Bool перед вашим геокодировщиком и изменить значение Bool после или внутри вашего метода displayLocationInfo

if updating == false { 
    updating = true 

CLGeocoder().reverseGeocodeLocation(locations.last as CLLocation, completionHandler: { (placemarkers, error:NSError!) -> Void in 
    ..... 
    self.displayLocationInfo(pm) 
    self.updating = false 
}) 
} 

в вашем func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) Вы должны сделать println(locations.count), чтобы проверить, сколько мест он возвращается. Если возвращено более одного места, вы обычно используете последний.

Так что вы должны изменить CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler: { (placemarks, error) -> Void in, чтобы использовать locations.last, так что вы можете сделать CLGeocoder().reverseGeocodeLocation(locations.last as CLLocation, completionHandler: { (placemarkers, error:NSError!) -> Void in.

Смежные вопросы