2011-03-30 33 views
3

我想問一下關於停止CLLocationManager -startUpdatingLocation的建議。目前,我正在考慮兩種方法,但我不能確定使用哪一個,並希望得到一個想法其他人是如何做到這一點:停止CLLocationManager?

Method_001:

[locationManager startUpdatingLocation]; 
[self performSelector:@selector(stopUpdatingLocation:) withObject:@"TimedOut" afterDelay:30]; 
  • 潛在浪費電池壽命一如既往運行30秒
  • 如果網絡速度較慢可能無法及時獲得準確位置
  • 感覺實現超時的方法非常簡單。

Method_002:

[locationManager startUpdatingLocation]; 

然後內:-locationManager:didUpdateToLocation:fromLocation:添加:

static int timeOut = 0; 
timeOut++; 

// Other code that checks for and stops 
// when a suitable result, accuracy, age etc is found. 

if(timeOut >= 4) { 
    [[self locationManager] stopUpdatingLocation]; 
    timeOut = 0; 
    return; 
} 
  • 可能無法在4(或更小)的嘗試解決準確位置。
  • 對於CLLocationManager,可能不會返回4個結果,我們從不超時。
  • 更好的電池壽命,因爲我們立即停止一個好的結果。

只是好奇嗎?

回答

2

嗯,我我認爲我更喜歡第一個。我不知道我們是否可以確定didUdpateToLocation:方法被調用的頻率。我認爲時間更加可靠。

+0

這就是我在想什麼,目前我正在使用method_002,但注意到有時沒有第四次調用委託。這似乎發生在第一次回報特別準確的情況下。同樣,如果將3設置爲超時,則特別困難的情況(小區覆蓋不良)不能準確解析到可用位置。 – fuzzygoat 2011-03-30 18:48:18

3

不確定你想要做什麼,但我認爲CLLocationManager內部處理這些情況。只是配置它這樣的:

locManager.desiredAccuracy = 2000.0f; // 2 kilometers - hope for accuracy within 2 km. 
locManager.distanceFilter = 1000.0f; // one kilometer - move this far to get another update 

,然後在回調didUpdateToLocation:fromLocation: 如果你有一個積極signbit,

[locManager stopUpdatingLocation]; // stop GPS 

編輯:添加signbit

if (signbit(newLocation.horizontalAccuracy)) { 
     // Negative accuracy means an invalid or unavailable measurement, so punt. 
} else { 
     // this is a usable measurement. 
    } 
+0

請問CLLocationManager到選擇 '禁用' 迴應? – atreat 2012-08-17 19:06:07

+0

@atreat - 良好的捕獲 - 這是我的代碼中的自定義包裝方法。我已更新爲使用正確的方法調用。 – Rayfleck 2012-08-21 18:03:41

+0

你是什麼意思「如果你有一個積極的signbit,」 – 2014-01-27 15:50:21

1

爲什麼不給這兩種方法結合起來,並給第三

我寫了一篇關於這個GIT回購,你是免費的(我最好的結果並沒有在一定的時間提高)使用 https://github.com/xelvenone/M6GPSLocationManager

  • 如果結果精度高於acceptableAccuracy更好,我們完成
  • 如果我們得到occuracy的更新,我們等待maximumWaitTimeForBetterResult以獲得更好的一個, - 如果不這樣做,我們正在這樣做,並採取最好的一個
  • 如果我們不斷得到更新,超過最大嘗試次數,我們會採取最好的一次(可能我們正在移動)
  • 如果我們在30秒內沒有得到任何其他更新,我們就完成了(不會有可能任何其他更新)

代碼

- (void)scopeToCurrentLocationWithAcceptableAccuracy:(CLLocationAccuracy)acceptableAccuracy 
        maximumWaitTimeForBetterResult:(NSTimeInterval)maximumWaitTimeForBetterResult 
           maximumAttempts:(NSInteger)maximumAttempts 
            onCompletion:(M6GPSLocationManagerCompletion)completion; 
相關問題