2016-08-18 3 views
1

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

Прежде всего, мой запрос на авторизацию появился только в течение секунды секунды, а затем исчез, поэтому я перенес его обратно в реальный вид. Однако мое обновление местоположения все еще не работает. Значок местоположения появляется на устройстве, но никогда не входит в функцию didLocationUpdate. Также он не вводит didFailWithError. Я довольно новичок в iOS, поэтому я понятия не имею, что я делаю неправильно.

Вот мой класс:

import CoreLocation 

class RouteLocation: NSObject, CLLocationManagerDelegate{ 

    var locationManager:CLLocationManager! 

    var databasePath = "" 
    override init(){ 

     super.init() 

     let dirPaths = 
      NSSearchPathForDirectoriesInDomains(.DocumentDirectory, 
               .UserDomainMask, true) 
     let docsDir = dirPaths[0] as NSString 

     databasePath = docsDir.stringByAppendingPathComponent(
      "\\firstAscent.db") 

     // For use in foreground 
     locationManager = CLLocationManager() 
     locationManager.requestWhenInUseAuthorization() 


     // locationManager.requestAlwaysAuthorization() 
     // print("in location") 

      if CLLocationManager.locationServicesEnabled() { 
       print("System Services enabled") 
       self.locationManager.delegate = self 
       self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
       self.locationManager.distanceFilter = 10 
       self.locationManager.startUpdatingLocation() 
      } 


    } 
    var isLocationMising = true 


    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     let locValue:CLLocationCoordinate2D = manager.location!.coordinate 

     let latitute = locValue.latitude 
     let longitute = locValue.longitude 
     print("locations = \(locValue.latitude) \(locValue.longitude)") //continues to make SQL query calls 

Я называю это с точки зрения с: _ = RouteLocation()

+0

http://stackoverflow.com/a/38961606/6297658 – Dravidian

+0

Я забыл упомянуть, что этот точный код работал, когда он был частью класса представления. – Xitcod13

+0

Вы не показываете код, в котором вы размещаете экземпляр 'RouteLocation', но из вашего описания это похоже на то, что вы выделяете его в локальной переменной. Как только эта функция выходит, локальная переменная освобождается, что означает, что ваш экземпляр 'CLLocationManager' освобожден. Вы должны выделить свой объект 'RouteLocation' как свойство вашего AppDelegate или сделать его одиночным, чтобы он был долговечным. – Paulw11

ответ

1
  1. requestWhenInUse... функция работает в асинхронном режиме. Он покажет диалог, но продолжит обработку остальной части кода одновременно. Ваше приложение не будет работать правильно в первый раз (когда будет предоставлено разрешение), даже если все остальное верно.
  2. Помогла ли вам описательная строка requestWhenInUseAuthorization?
  3. Я думаю, что вы создаете экземпляр класса, в котором запускается init, и мгновенно умирает. Нет ничего, чтобы сохранить его. Поэтому didUpdateLocation не может быть вызван.
  4. Если вам нужно всего одно место, позвоните по телефону requestLocation.
+0

Я запустил приложение несколько раз и разрешил всегда авторизацию, поэтому точка номер один не должна быть проблемой. У меня есть строка объяснения авторизации запроса, и она работает правильно. Для точки 3 вы знаете, как это исправить. У меня есть комментарий, что я должен выделить свой RouteLocation как свойство моего AppDelegate, но я не знаю, как это сделать. Кроме того, я не хочу запускать запрос locaion навсегда столько, сколько потребуется, чтобы собрать достаточно точное место для добавления в базу данных. – Xitcod13

+0

@ Xitcod13 Не сейчас, но в первый раз кто-то его устанавливает, он не будет работать правильно. Чтобы сохранить объект, как, например, создать свойство 'let routeLocation = RouteLocation()' в AppDelegate? Если вам нужна только одна запись, рассмотрите 'requestLocation'. – MirekE

+0

Мне, возможно, придется перестроить всю мою конструкцию. Мне нужно, чтобы местоположение начало обновляться, как только кто-то входит в мое представление, потому что я знаю, что они пытаются добавить это местоположение в базу данных. Причина, по которой у меня есть это в отдельном классе, - это то, что кто-то может нажать кнопку финиша, добавив кнопку местоположения, и вид исчезнет, ​​хотя местоположение все еще может быть собрано. Таким образом, использование RouteLocation() в AppDelegate не будет работать, если я не начну и не остановлю его из класса вида. (и также полезно иметь несколько экземпляров routeLocation сразу) – Xitcod13

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