2016-08-18 149 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的属性,但我不知道该怎么做。此外,我不想永远运行本地化请求,只要收集足够精确的位置以添加到数据库即可。 – Xitcod13

+0

@ Xitcod13不是现在,但第一次有人安装它不会正常工作。为了保留这个对象,例如在AppDelegate中创建一个属性'let routeLocation = RouteLocation()',怎么样?如果您只需要一个位置条目,请考虑'requestLocation'。 – MirekE

+0

我可能不得不重构我的整个设计。只要有人进入我的视图,我就需要该位置开始更新,因为我知道他们正试图将该位置添加到数据库。我将它放在单独的课程中的原因是,除了单击完成添加位置按钮之外,即使仍然可以继续收集位置,视图也会消失。因此,在AppDelegate中使用RouteLocation()将无法工作,除非我以某种方式从视图类中启动并停止它。 (并且能够同时拥有多个routeLocation实例也是有帮助的) – Xitcod13