2013-01-21 79 views
0

首先,我對iOS Dev和Objective-C非常陌生。所以請原諒任何愚蠢的問題或代碼。iOS位置管理器多次觸發

我一直在iPhone上測試位置服務。我有這樣的代碼,通過的NSTimer發射了:

- (void)startLocationTracking 
{ 

    if(self.locationManager==nil){ 
    _locationManager=[[CLLocationManager alloc] init]; 

    _locationManager.delegate=self; 

    _locationManager.desiredAccuracy=kCLLocationAccuracyBest; 

    _locationManager.distanceFilter=1; 

    self.locationManager=_locationManager; 

    } 

if([CLLocationManager locationServicesEnabled]){ 

    [self.locationManager startUpdatingLocation]; 

    } 

} 

這裏是我的位置管理器功能:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

[self timerLog]; 

NSString *deviceID = [self getUUID]; 

double lat = newLocation.coordinate.latitude; 
double lon = newLocation.coordinate.longitude; 
double alt = newLocation.altitude; 
double dir = newLocation.course; 
double spd = newLocation.speed; 
double ha = newLocation.horizontalAccuracy; 
double va = newLocation.verticalAccuracy; 

NSDateFormatter *formatter; 
NSString  *ts; 

formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; 

ts = [formatter stringFromDate:[NSDate date]]; 

[self geoTrackingWS :deviceID :lat :lon :alt :dir :spd :ha :va :ts]; 

[manager stopUpdatingLocation]; 

} 

出於某種原因,我的功能geoTrackingWS被多次隨意射擊了。 NSTimer每1分鐘運行一次(就像測試一樣),有時它可以正常工作,它只需要調用geoTrackingWS一次,但其他時間只需要2到3次。

我已經做了日誌記錄,我可以看到我的NSTimer工作正常,並且因爲它應該發射。

我有一種感覺,它與我的手機上的另一個應用程序有關,但我不確定。

對此的任何幫助或見解都會很棒。

感謝

回答

1

位置管理通常有確定你的位置,包括多種方式:

  • 手機信號塔;
  • wifi網絡標識;
  • GPS。

其中第一個是最準確的,但最容易得到的,第二個通常更準確的是,但需要一段更長的時間來弄清楚(因爲是爲查找一個網絡請求),最終是最準確的,但可以需要相當長的一段時間才能找出(尋找衛星等)。

因此,它預計的行爲是,位置管理器將會以越來越準確的結果做出響應,並且運行時間越長。例如,您可以在運行Google Maps時看到這一結果 - 通常會將您拉到相當廣泛的區域,然後花費一些時間來獲得更準確的估計值。

+0

因爲有時會檢查全部3個,所以我可能會達到3點嗎?這可能是爲什麼我的geoTrackingWS函數在1到3次的任何地方運行? – Sequenzia

+0

是的,絕對。在iPhone上(有三個傳感器,有些設備只有一個),可以想象你會得到三個估計值。每個新的應該比以前更準確 - 嘗試記錄水平和垂直精度,看看是否是這樣。 – Tommy

+0

感謝您的幫助。我認爲這就是它。我結束了抓住最後一個,它似乎運作良好,它更準確。謝謝。 – Sequenzia

1

你可能不希望創建一個新的CLLocationManager實例不止一次,它調用-startLocationTracking從計時器會做。從代碼的外觀來看,我認爲你只需要調用-startLocationTracking一次,然後位置API會在有新信息時將消息發送給你的委託(你指定爲self)。您可能想要重新理解委託模式,並查看使用CLLocationManager的一些示例代碼。我希望有所幫助。