web-dev-qa-db-ja.com

didUpdateToLocationの代わりにdidUpdateLocations

IOS6のリリースにより、Appleは、didUpdateToLocationの代わりにdidUpdateLocationsを使用することを望んでいます。didUpdateLocationsを適切に使用する方法を説明できますか?

66
YogevSitton

次のデリゲートを使用して最後の位置を取得したと思いますか?

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

上記のデリゲートはiOS 6で非推奨になりました。現在、次のものを使用する必要があります。

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateLocations:(NSArray *)locations

最後の位置を取得するには、配列の最後のオブジェクトを取得するだけです:

[locations lastObject]

言い換えると、 [locations lastObject](新しいデリゲート)はnewLocation(古いデリゲート)と等しくなります。

125
Anne

ここにある他の回答では、locations配列がある理由と、提供された新しいdidUpdateLocations:配列を適切に使用する方法については説明していません。

locationManager:didUpdateToLocation:fromLocation:を廃止し、代わりに場所のNSArrayを送信する目的は、バックグラウンドで実行するときの消費電力を削減することです。

IPhone 5以降、GPSチップには、場所を一定期間保存し、一度にすべてを一度に配列で配信する機能があります。これは、遅延ロケーション更新と呼ばれます。これにより、メインCPUはバックグラウンドで長時間スリープすることができます。つまり、iOSは位置の更新ごとにメインCPUを起動する必要がなく、GPSチップが位置を収集している間、CPUはスリープできます。

deferredLocationUpdatesAvailable メソッドを使用して、この機能を確認できます。可能な場合は、allowDeferredLocationUpdatesUntilTraveled:timeout:メソッドを使用して有効にすることができます。いくつかの条件が適用されます。詳細については、 this answer を参照してください。

64
progrmr

使用できる最後の場所にアクセスするためのオブジェクトの配列を提供します

[locations lastObject]

このデリゲートメソッドから

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
22
Janak Nirmal

これは、非推奨のメソッドと同様に機能するようにメソッドを実装する方法です。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations.lastObject;
    CLLocation *oldLocation;
    if (locations.count > 1) {
        oldLocation = locations[locations.count - 2];
    }
}
7
Groot

IOS 5と6の両方をサポートしている場合は、電話する必要があります

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations, 

古いから

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

機能、場所の配列を構築する。

3
Mustafa

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は、アレイの奥深くに埋められます。

2
bitsand