2011-12-27 6 views
2

私はVCでCoreLocationマネージャを持っていますが、ユーザーが「方向を取得」ボタンを押すと、位置マネージャが初期化され、アプリは現在の場所とあらかじめ定義された目的地の場所でGoogleマップの方向を開きます。コアの場所は、いつでもバックグラウンドから来る古い場所を与える

アプリがバックグラウンド状態でない場合、現在の位置はほぼ常に真です。同じVCのバックグラウンドからアプリを呼び出すと、ユーザーが「方向を取得」ボタンをもう一度押すと、現在の場所は一般的に古い場所を示します。一言で言えば、私はマルチタスキングで悩まされており、検索された場所のタイムスタンプは私の問題を解決しませんでした。

IBAction:

if (self.locationManager) { 
     [_locationManager release]; 
     self.locationManager = nil; 
    } 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 

    self.locationTimer = [NSTimer scheduledTimerWithTimeInterval:LOCATION_TIMER target:self selector:@selector(stopUpdatingLocationTimer) userInfo:nil repeats:NO]; 
    HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; 
    [self.locationManager startUpdatingLocation]; 

コア場所委任:

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


NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
NSLog(@"%f",locationAge); 
if (locationAge > 3.0) 
    return; 

if (newLocation.horizontalAccuracy < 0) 
    return; 

if (self.currentLocation == nil || self.currentLocation.horizontalAccuracy > newLocation.horizontalAccuracy) { 

    self.currentLocation = newLocation; 

    if (self.currentLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy) { 

     [self stopUpdatingLocations:YES]; 

    } 

} 

}

答えて

0

あなたの例では、locationAgenewLocationtimestampからの秒数の負の表現です。これは、locationAgeが決して3より大きくならないことを意味し、あなたは事実上すべての更新をふるいに通しています。同じ問題に遭遇した人のために

NSTimeInterval locationAge = [newLocation.timestamp timeIntervalSinceNow]; 
+0

マークは、私はAppleのLocateMeのサンプルコードでそれを参照してください、私はコピー:NSTimeInterval locationAgeは= - [newLocation.timestamp timeIntervalSinceNow]。 if(locationAge> 5.0)が返されます。それから、それは間違っていると言いますか? – ubaltaci

+0

ああ、彼らは '-timeIntervalSinceNow'を使用していますので、負の値になります。負の値になると、負の値が逆になります。 (それは私には全く逆のようです)あなたは古い更新情報が得られていることをどのように知っていますか?あなたは彼らが3秒以上過ごしていると確信していますか? –

+0

私は車でテストしたので、最初にアプリを開いて、あらかじめ決められた場所に向かいました。その後、私は2〜2.5km旅行しました。その後、私は再びアプリを起動します(バックグラウンド状態)それは私に古いものである間違った場所を与える。私はこのような3-4回のテストをしており、すべてが間違っています。 – ubaltaci

0

、また

、ウェブ上のコアの位置が関連するいくつかのチュートリアル、私にこの問題を導く:このような

設定locationAge

もちろん、CLLocation ivar が設定され、Googleマップが呼び出されると、私のアプリはバックグラウンドに移行します。

その後、私のアプリは、新しく来 その後、ユーザーがバックグラウンドからの呼び出し、および場所の更新を開始、
古いCLLocationのIVARはnilに、おそらく最高のhorizantal精度ではありません。したがって、 CLLocationのIVAR で

if (self.currentLocation == nil || self.currentLocation.horizontalAccuracy > newLocation.horizontalAccuracy) 

このライン問題を引き起こす、と古い場所を交換することはありません。

私はviewDidDisappearをこのように変更して、CLLocation変数にnil値を割り当て、完全に機能します。

p.s:ありがとうマーク・アダムス

関連する問題