IOS6のリリースにより、Appleは、didUpdateToLocationの代わりにdidUpdateLocationsを使用することを望んでいます。didUpdateLocationsを適切に使用する方法を説明できますか?
次のデリゲートを使用して最後の位置を取得したと思いますか?
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
上記のデリゲートはiOS 6で非推奨になりました。現在、次のものを使用する必要があります。
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
最後の位置を取得するには、配列の最後のオブジェクトを取得するだけです:
[locations lastObject]
言い換えると、 [locations lastObject]
(新しいデリゲート)はnewLocation
(古いデリゲート)と等しくなります。
ここにある他の回答では、locations配列がある理由と、提供された新しいdidUpdateLocations:配列を適切に使用する方法については説明していません。
locationManager:didUpdateToLocation:fromLocation:
を廃止し、代わりに場所のNSArrayを送信する目的は、バックグラウンドで実行するときの消費電力を削減することです。
IPhone 5以降、GPSチップには、場所を一定期間保存し、一度にすべてを一度に配列で配信する機能があります。これは、遅延ロケーション更新と呼ばれます。これにより、メインCPUはバックグラウンドで長時間スリープすることができます。つまり、iOSは位置の更新ごとにメインCPUを起動する必要がなく、GPSチップが位置を収集している間、CPUはスリープできます。
deferredLocationUpdatesAvailable
メソッドを使用して、この機能を確認できます。可能な場合は、allowDeferredLocationUpdatesUntilTraveled:timeout:
メソッドを使用して有効にすることができます。いくつかの条件が適用されます。詳細については、 this answer を参照してください。
使用できる最後の場所にアクセスするためのオブジェクトの配列を提供します
[locations lastObject]
このデリゲートメソッドから
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
これは、非推奨のメソッドと同様に機能するようにメソッドを実装する方法です。
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = locations.lastObject;
CLLocation *oldLocation;
if (locations.count > 1) {
oldLocation = locations[locations.count - 2];
}
}
IOS 5と6の両方をサポートしている場合は、電話する必要があります
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations,
古いから
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
機能、場所の配列を構築する。
LocationManager:didUpdateLocations:によって返されるCLLocationオブジェクトの配列には、以前の場所が含まれている場合と含まれていない場合があります。言い換えると、まれに配列内の位置が1つだけになる場合があります。以下を使用して確認します。複数のオブジェクトがある場合、最新の以前の場所を取得できます。
int objCount = [locations count];
if (objCount > 1) {
CLLocation *oldLocation = [locations objectAtIndex:objCount - 1];
}
配列には少なくとも1つのオブジェクトがあるため、現在の位置の取得は、配列の最後のオブジェクトを要求することによって行われます。最後のオブジェクトが唯一のオブジェクトであっても、それは問題ありません:
CLLocation *newLocation = [locations lastObject];
これは配列であるため、上記の例のoldLocationは必ずしも探しているものではないことに注意してください。これは、DistanceFilter:およびdesiredAccuracy:プロパティの設定方法に依存します。これらのプロパティは、場所の配列の設定方法に影響するためです。目的のoldLocationは、アレイの奥深くに埋められます。