2011-09-12 5 views
0

以下のコードで無限ループが発生しました。ユーザーが「getDirections」メソッドボタンを押すと、アラートが正しく発生します。アラートボタンから「Drectionsを取得」を選択すると、Googleマップは完全に機能します。彼らはアプリケーションを再開すると、このビューに戻り、アプリケーションは直ちにGoogleマップに戻り、再度メソッドを再実行します。私がこれを止めることができるのは、「アプリケーションはバックグラウンドで実行されません」をYESにしたことです。これはやりたくありません。CLLocationManager実行ループ

誰かが私になぜこれが起こっているのかを伝えることができますか?

-(IBAction)getDirections 
{ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Directions" message:@"Do you want driving directions?" delegate:self cancelButtonTitle:@"No Thanks" otherButtonTitles:@"Get Directions", nil]; 
    [alert show]; 
    [alert release]; 
} 

-(void)showDirections 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    [locationManager startUpdatingLocation]; 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    CLLocationCoordinate2D coord = [newLocation coordinate]; 
    NSArray *array = [dataHold objectForKey:@"Subtree"]; 
    NSString *latitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:4]]; 
    NSString *longitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:5]]; 
    double clubLatitude = [latitude doubleValue]; 
    double clubLongitude = [longitude doubleValue]; 
    urlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f", coord.latitude, coord.longitude, clubLatitude, clubLongitude]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
     buttonString = [alertView buttonTitleAtIndex:buttonIndex]; 
     if([buttonString isEqualToString:@"Get Directions"]) 
     { 
      [self showDirections]; 
      buttonString = nil; 
     } 
     else if([buttonString isEqualToString:@"No Thanks"]) 
     { 
      nil; 
     } 
} 

答えて

2

次のコードはありません。 (CLLocationManager *)マネージャーdidUpdateToLocation:あなたは (無効)locationManagerに追加する必要があります(CLLocation *)newLocation fromLocation:(CLLocation *)をoldLocation方法

[locationManager stopUpdatingLocation]; 
2

あなたがCLLocationManager startUpdatingLocatoinをccll一度didUpdateToLocationデリゲートメソッドは常に呼ばれています。

このように、didUpdateToLocationのコードは、バックグラウンドからアプリを起動しても、場所が更新されるたびに呼び出されます。 locationManagerのdistanceFilterプロパティに応じて、このメソッドが多く呼び出されます。これを確認するには、NSLogステートメントをデリゲートメソッドに追加し、呼び出された回数を確認します。その方法の

ドキュメントに:この方法の

ディスカッション実装はオプションです。ただし、 このメソッドを実装する必要があります。

このメッセージがデリゲートに配信されるまでに、新しい ロケーションデータは、CLLocationManager オブジェクトから直接入手することもできます。 newLocationパラメータには、ロケーションサービスの以前の使用方法からキャッシュされたデータ が含まれている場合があります。ロケーションオブジェクトの タイムスタンププロパティを使用して、 の位置データがどれだけ最近であるかを判断できます。

このガイドに従って、didUpdateToLocationメソッド内にtimeStamp(または他の種類の識別子)を保存してください。

タイムスタンプを設定したら、それらの値を使用してGoogleマップを表示できます。 Sidenote:あなたのCLLocationManagerには、locationというプロパティがあり、didUpdateToLocationが呼び出されるたびに更新を取得します。したがって、そのプロパティを使用してコードの現在の場所を取得することができます。

HTH

+0

Shaharyar、私は一つだけdidUpdateToLocationを必要とするので、私はstopUpdatingLocationと呼ばれますdidUpdateToLocationメソッドの終わりに。素晴らしい仕事をした。本当にありがとう! – Eric

関連する問題