web-dev-qa-db-fra.com

didUpdateLocations au lieu de didUpdateToLocation

Avec la sortie d'iOS6 Apple veut que nous utilisions didUpdateLocations au lieu de didUpdateToLocation. Quelqu'un peut-il expliquer comment utiliser correctement didUpdateLocations?

66
YogevSitton

Je suppose que vous avez utilisé le délégué suivant pour obtenir le dernier poste?

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

Le délégué ci-dessus est déconseillé dans iOS 6. Les éléments suivants doivent maintenant être utilisés:

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

Pour obtenir la dernière position, récupérez simplement le dernier objet du tableau:

[locations lastObject]

En d'autres termes, [locations lastObject] (nouveau délégué) est égal à newLocation (ancien délégué).

125
Anne

Aucune des autres réponses ici n'explique pourquoi il existe un tableau d'emplacements et comment utiliser correctement le nouveau tableau didUpdateLocations: fourni.

Le but de déprécier le locationManager:didUpdateToLocation:fromLocation: et l'envoi à la place d'un NSArray d'emplacements permet de réduire la consommation d'énergie lors de l'exécution en arrière-plan.

À partir de l'iPhone 5, la puce GPS a la capacité de stocker des emplacements pendant une période de temps, puis de les livrer tous en même temps dans un tableau. C'est ce qu'on appelle les mises à jour d'emplacement différées. Cela permet au processeur principal de rester en veille plus longtemps en arrière-plan. Cela signifie que iOS n'a pas à démarrer le processeur principal pour chaque mise à jour de position, le processeur peut dormir, tandis que la puce GPS recueille les emplacements.

Vous pouvez vérifier cette capacité en utilisant la méthode deferredLocationUpdatesAvailable . Si disponible, vous pouvez l'activer à l'aide de allowDeferredLocationUpdatesUntilTraveled:timeout: méthode. Certaines conditions s'appliquent, voir cette réponse pour plus de détails.

64
progrmr

Il vous donne un tableau d'objets pour accéder au dernier emplacement que vous pouvez utiliser

[locations lastObject]

à partir de cette méthode déléguée

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

C'est ainsi que la méthode peut être implémentée pour fonctionner de manière similaire à celle obsolète

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

Si vous prenez en charge iOS 5 et 6, vous devez appeler

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

des plus âgés

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

fonction, en construisant un tableau d'emplacements.

3
Mustafa

Il est à noter que le tableau d'objets CLLocation renvoyé par locationManager: didUpdateLocations: peut ou non inclure un ancien emplacement. En d'autres termes, il peut y avoir en de rares occasions un seul emplacement dans le tableau. Utilisez les éléments suivants pour vérifier et s'il existe plusieurs objets, nous pouvons récupérer l'emplacement antérieur le plus récent:

int objCount = [locations count];
if (objCount > 1) {
    CLLocation *oldLocation = [locations objectAtIndex:objCount - 1];
}

Comme il y aura au moins un objet dans le tableau, la récupération de l'emplacement actuel se fait en demandant le dernier objet du tableau. Même si le dernier objet est le seul objet, c'est OK:

CLLocation *newLocation = [locations lastObject];

Gardez à l'esprit que comme il s'agit d'un tableau, oldLocation dans l'exemple ci-dessus ne sera pas nécessairement celui que vous recherchez. Cela dépend de la façon dont vous définissez les propriétésDistanceFiltre: et souhaitéeAccuracy: car ces propriétés auront un impact sur la façon dont votre tableau d'emplacements est rempli. L'ancien emplacement souhaité peut être enfoui plus profondément dans la baie.

2
bitsand