2016-08-18 139 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