Avec la sortie d'iOS6, Apple souhaite que nous utilisions didUpdateLocations au lieu de didUpdateToLocation. Quelqu'un peut-il expliquer comment utiliser correctement didUpdateLocations?
Réponses
Trop de publicités?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 obsolète dans iOS 6. À présent, il convient d'utiliser les éléments suivants:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
Pour obtenir la dernière position, obtenez 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é).
Aucune des autres réponses ici expliquer pourquoi il y a un emplacement de tableau et comment utiliser correctement la nouvelle didUpdateLocations: array qui est fourni.
Le but de la dépréciation de l' locationManager:didUpdateToLocation:fromLocation:
et l'envoi d'un NSArray des emplacements est de réduire la consommation d'énergie lors de l'exécution en arrière-plan.
Depuis l'iPhone 5, la puce GPS a la capacité de stocker des emplacements pour une période de temps et ensuite de les livrer à la fois dans un tableau. Ceci est appelé différés emplacement des mises à jour. Cela permet au PROCESSEUR principal de dormir pendant une longue période de temps alors que dans le fond. Cela signifie iOS n'avez pas à démarrer le PROCESSEUR principal pour chaque mise à jour de position, le CPU peut de sommeil, tandis que la puce GPS recueille des lieux.
Vous pouvez vérifier cette capacité à l'aide de l' deferredLocationUpdatesAvailable
méthode. Si disponible, vous pouvez l'activer à l'aide d' allowDeferredLocationUpdatesUntilTraveled:timeout:
méthode. Certaines conditions s'appliquent, voir cette réponse pour plus de détails.
C’est ainsi que la méthode peut être mise en œuvre pour fonctionner de la même manière que la méthode déconseillée.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = locations.lastObject;
CLLocation *oldLocation;
if (locations.count > 1) {
oldLocation = locations[locations.count - 2];
}
}
Si vous prenez en charge à la fois iOS 5 et 6, vous devez appeler
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations,
des plus vieux
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
fonction, en construisant un éventail d'emplacements.