2011-08-03 20 views
0

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocationを使用してGPSから座標を取得する標準的な方法を実装しました。持続時間のGPS座標を取得できません

この関数は、初期化時にのみ呼び出され、プログラムの使用期間中は呼び出されません。これは正常ですか?

アンドロイドでリスナーを実装すると、すぐにデータが取得されます。

これは私のやり方ではありませんか?そうであれば、何が問題なのでしょうか? (ところで、私がチェックしました、私はstopUpdatingLocationをしません)

私はCLLocationManagerは私が遅い更新

[cllm startUpdatingLocation]; 
self.locationManagerDelegate = delegate; 

以降を開始testingという名前のクラスを継承し、

testing* cllm = [[testing alloc] init]; 
     cllm.delegate = self; 

それを初期化してい

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

ですが、それ以降は呼び出されません。私は頻繁に呼び出される必要があるので、私はどこからXまでの距離を計算することができます。

答えて

1

は、より多くのコードなしで私が提供できる最善の解決策は、デバイスが一緒に移動するたびに更新するために、それを伝えるために、このです:

[self.locationManager setDistanceFiler:kCLDistanceFilterNone] 

更新

私が通過しましたあなたのロケーションマネージャのサブクラスが正常に動作していると思われるコードを見つけました

- (void)viewDidLoad { 
[super viewDidLoad]; 
//Location 

// create new location manager 
self.locationManager = [[CLLocationManager alloc] init]; 
self.locationManager.delegate = self; 

self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
self.locationManager.distanceFilter = kCLDistanceFilterNone; 

// start location manager 
[self.locationManager startUpdatingLocation]; 
} 

-(void) distanceBetweenUserandPin { 
CLLocation *currentUserLocation = [[CLLocation alloc] initWithLatitude:_currentLocation.latitude longitude:_currentLocation.longitude]; 
CLLocation *currentPinLocation = [[CLLocation alloc] initWithLatitude:_pinLocation.latitude longitude:_pinLocation.longitude]; 
CLLocationDistance distanceBetweenUserAndPinMeters = [currentUserLocation distanceFromLocation:currentPinLocation]; 

} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
//This successfully saves Lat, Long Data to a point location 
CLLocationCoordinate2D location = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude); 
NSLog(@"%f, %f", location.latitude, location.longitude); 
//This assigns the value of location to the ivar _currentLocation 
_currentLocation = CLLocationCoordinate2DMake(location.latitude, location.longitude); 
NSLog(@"%f, %f", _currentLocation.latitude, _currentLocation.longitude);  

} 
+0

ありがとうございます完全なコード!それは私の多くを助けた! – Alex

1

まず、CLLocationManagerのサブクラスを使用するのは私には奇妙に思えます。なぜなら、私はあなたに何のメリットがあるのか​​よくわからないからです。 CLLocationManagerdocumentationから、それは問題ではないのですが...

と仮定すると:

このメソッドはすぐに戻ります。このメソッドを呼び出すと、 ロケーションマネージャは最初のロケーション修正( 数秒かかる)を取得し、その locationManager:didUpdateToLocation:fromLocation:メソッドを呼び出してデリゲートに通知します。その後、 受信者は、 distanceFilterプロパティの値を超過したときに主に更新イベントを生成します。ただし、状況によっては別の でアップデートが配信されることもあります。例えば、受信機は、ハードウェアがより正確な位置の読み取り値を集める場合、別の 通知を送ることができる。

何が起きているかは、初期位置修正のために一度呼び出されていますが、他の条件が変更されていないために再度呼び出されていないことです。ユーザーがどこにも移動しない場合は、新しい場所データは前回と同じになるため、提供されません(ドキュメントに記載されている例外はいくつかあります)。

アプリをテストしているときは、移動して場所を変更してアップデートを作成してください。それでも解決しない場合は、desiredAccuracydistanceFilterプロパティを使って実験してみてください:

あなたは startUpdatingLocationメソッドを呼び出すことにより、標準のロケーションサービスを開始します。このサービスは、 ロケーションイベントの配信よりも細かい制御を必要とするアプリケーションの場合は、 に最も適しています。具体的には、 desiredAccuracyプロパティとdistanceFilterプロパティの値を考慮して、 が新しいイベントを配信するタイミングを決定します。

それ以外は、CLLocationManagerをどのようにサブクラス化しているのかが関係していると思います。そのコードの一部を提供することが役立つかもしれません。

@Mattと合意した
関連する問題