2013-07-15 88 views
0

基於另一個SO問題,我已經實現了didUpdateLocations:方法如下:didUpdateToLocations:永不結束?

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    // Get the latest location found 
    CLLocation *location = [locations lastObject]; 

    NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow]; 

    if (locationAge > 5.0) return; 
    if (location.horizontalAccuracy < 0) return; 

    if (_bestEffort == nil || _bestEffort.horizontalAccuracy >= location.horizontalAccuracy) { 
     _bestEffort = location; 

     // Let the delegate know 
     if (self.delegate && [self.delegate respondsToSelector:@selector(location:didUpdateLocationTo:)]) { 
      [self.delegate location:self didUpdateLocationTo:location]; 
     } 

     if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) { 
      // Great, we've found our final location so stop searching! 
      [self stopTrackingLocation]; 

      // Let our delegate know we've finished our work 
      if (self.delegate && [self.delegate respondsToSelector:@selector(location:didFinishTrackingLocationWithFinalLocation:)]) { 
       [self.delegate location:self didFinishTrackingLocationWithFinalLocation:location]; 
      } 
     } 
    } 
} 

一切有意義此代碼,但我似乎無法使其正常工作。當我通過代碼,我發現

  • locationAge小於5,這是很好的
  • 位置horizo​​ntalAccuracy小於0,這是很好
  • bestEfforts水平精度相同的位置水平準確性,所以它永遠不會進入該條件
  • 即使它做到了,它也不會調用stopTrackingLocation方法,因爲horizo​​ntalAccuracy的位置永遠不會是< 0(第二個if語句),但是,我的位置管理器所需的準確度爲-2(最佳對於導航),所以它從來沒有實際上離開這個方法。

我在做什麼錯,或者我應該如何改變它以正確工作?

+0

horizo​​ntalAccuracy小於0表示該位置無效。 – progrmr

+0

爲什麼你想要的準確度爲'-2'?它應該是一個正值,如50或100,取決於您需要多少準確度(以米爲單位)? – progrmr

+0

這就是我的想法,但這正是我所得到的。我傳入'kCLLoationAccuracyBestForNavigation'並獲得-2,'kCLLocationAccuracyBest'則傳遞-1。我把它改成了10米,看起來不錯,但我仍然不明白爲什麼我會爲其他兩個獲得-1/-2? – PaReeOhNos

回答

0

問題是,您正試圖獲得水平精度低於您所需的精度的位置。

if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) { 

然而,常數kCLLoationAccuracyBestForNavigationkCLLocationAccuracyBest不是真正的價值,他們是-2和-1分別。

問題是你真的需要什麼準確性需要爲你的目的?這是你應該檢查的價值。爲了測試目的,使用100米。這意味着你可能有一個使用GPS的位置,而不僅僅是WiFi或者蜂窩。

if (location.horizontalAccuracy <= 100) { 

實際horizo​​ntalAccuracy絕不會小於5米,與iPhone 5,它可以是取決於有多少顆衛星是可見的,其幾何形狀10或20或50。如果系統根本無法修復,它也可以是-1。這就是這條線是,忽略那些無效的位置:

if (location.horizontalAccuracy < 0) return; 

編輯:
常數kCLLoationAccuracyBestForNavigation當你配置CLLocationManager對象的desiredAccuracy財產kCLLocationAccuracyBest,才應使用。 desiredAccuracy設置將核心位置硬件配置爲啓用GPS,GLONASS等,以嘗試以滿足您所需的準確性(並不保證它會被滿足)。

desiredAccuracy不是您應該在委託方法中使用的值,它只是在那裏配置CLLocationManager。

+0

我明白代碼在做什麼以及爲什麼它永遠不會返回。我無法弄清楚爲什麼導航和最佳準確度值是-1和-2,並且我找不到任何以這種方式使用它們的例子。我已經將代碼降到了最接近的10米,因爲精確度不是很重要,但我確實希望能夠從用戶位置(準確地)檢索地址,因爲它將用於導航目的。 – PaReeOhNos

+0

我添加了更多上面我的回答解釋說,你仍然想使用這些常量,但只有在設置'desiredAccuracy'屬性時。 – progrmr

+0

很好的解釋,歡呼:) – PaReeOhNos