2015-04-07 2 views
0

Проблема: мне нужно, чтобы координаты местоположения были получены до того, как getReports() выполняется в viewDidLoad(). Как вы можете видеть, я сначала вызываю startLocationUpdates в viewDidLoad(). К сожалению, существует задержка между вызовом startLocationUpdates() и вызываемым вызовом doUpdateLocations. Эта задержка вызывает координаты широты и долготы каждый раз перед выполнением getReports().Swift - Получение координат GPS из didUpdateLocations, слишком долго возвращающих значения

Как я могу быть уверенным, что didUpdateLocations вызывается ДО getReports(), чтобы значения широты и долготы были установлены правильно?

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.startLocationUpdates() 

    // Do any additional setup after loading the view. 
    self.mapView.delegate = self 

    if mblnLocationAcquired { 
     getReports() 
    } 

    } 

} 

func startLocationUpdates() { 
    var currentLocation = CLLocation() 

    mLocationManager.desiredAccuracy = kCLLocationAccuracyBest 
    mLocationManager.delegate = self 
    //mLocationManager.requestWhenInUseAuthorization() 
    mLocationManager.requestWhenInUseAuthorization() 
    mLocationManager.startUpdatingLocation() 
} 

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

    let location = locations.last as CLLocation 
    self.mdblLat = location.coordinate.latitude 
    self.mdblLong = location.coordinate.longitude 

    println("didUpdateLocation \(location.coordinate.latitude), \(location.coordinate.longitude)") 
    mLocationManager.stopUpdatingLocation() 
    mblnLocationAcquired = true 
} 
+0

Не удалось ли вызвать getReports из didUpdateLocations (после вызова stopUpdatingLocation) вместо viewDidLoad? – Anna

+0

Я думал об этом. Однако метод didUpdateLocations вызывается повторно даже после вызова stopUpdatingLocation. Я не хотел, чтобы getReports вызывался много раз в процессе. – play2win

ответ

1

Как я могу быть уверен, что didUpdateLocations вызывается ДО getReports() так, чтобы значения широты и долготы, которые установлены правильно?

Простой. Не звоните getReports() до после широта и долгота установлены правильно! Вы делаете огромную ошибку, отключая обновления, как только произойдет обновление . Имейте в виду, что после того, как вы начнете обновление местоположения, требуется время, необходимое для «прогрева» GPS. Вы получите множество первоначальных обновлений, в которых местоположение не имеет смысла или миль. Вам нужно использовать считывание точности местоположения, чтобы дождаться, пока вы не увидите значение , прежде чем отображать что-либо.

+0

См. Мой код книги для примера: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch22p773location/ch35p1032location/ViewController.swift Обратите внимание, что я продолжаю проверять 'horizontalAccuracy', пока не получу достаточно хороший ответ - и _then_ Я перестаю обновлять. Я также готов к тому, что мы не получим хорошего ответа (пользователь может быть в помещении), и в этом случае я намеренно тайм-аут. – matt

+0

Спасибо за ответ. По какой-то причине didUpdateLocations продолжает получать вызовы повторно даже после вызова stopUpdatingLocations. Я думал о вызове getReports после того, как didUpdateLocations успешно выполняется, но если didUpdateLocations вызывается повторно, так будет getReports, если я настрою его таким образом. Есть ли способ обойти это поведение? – play2win

+0

Нет, 'stopUpdatingLocation' останавливает обновления. Мой пример, на который я указал вам, - это загружаемый проект, поэтому загрузите его и запустите, и вы увидите. Если вы думаете, что все еще получаете обновления, то происходит что-то еще. В любом случае вам нужно переосмыслить всю структуру вашего подхода. Снова посмотрим, как работает мой пример. – matt

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