Comment arrêter plusieurs fois l'appel de méthode de didUpdateLocations() dans ios
Ce mon code......
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
location_updated = [locations lastObject];
NSLog(@"updated coordinate are %@",location_updated);
latitude1 = location_updated.coordinate.latitude;
longitude1 = location_updated.coordinate.longitude;
self.lblLat.text = [NSString stringWithFormat:@"%f",latitude1];
self.lblLon.text = [NSString stringWithFormat:@"%f",longitude1];
NSString *str = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",latitude1,longitude1];
url = [NSURL URLWithString:str];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
if (connection)
{
webData1 = [[NSMutableData alloc]init];
}
GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = CLLocationCoordinate2DMake(latitude1,longitude1);
marker.title = formattedAddress;
marker.icon = [UIImage imageNamed:@"m2.png"];
marker.map = mapView_;
marker.draggable = YES;
}
Cette méthode est de les appeler plusieurs fois que je ne veux pas.....
- Alors pourquoi l'appelez-vous cette méthode?
- À l'emplacement de mise à jour après chaque cinq minutes.
- Quand vous commencez d'abord les services de localisation, vous pouvez le voir appelé à plusieurs reprises avec de plus en plus des endroits précis (par exemple, la diminution de
horizontalAccuracy
). Également définirCLLocationManager
propriétésdistanceFilter
etdesiredAccuracy
pour contrôler la façon dont c'est souvent appelée. - Swift 3 version de accepté de répondre à stackoverflow.com/a/43066729/7250862
Vous devez vous connecter pour publier un commentaire.
Ajouter un peu de restriction de là. Pour le laps de temps entre les emplacements et la précision
if(distance > 20) { _currentLocation = newLocation; //significant location update }
Tout en allouant votre
LocationManager
objet, vous pouvez définir ledistanceFilter
propriété de laLocationManager
. Filtre de Distance de la propriété est unCLLocationDistance
valeur qui peut être défini à en aviser le directeur des lieux à propos de la distance parcourue en mètres. Vous pouvez définir la distance filtre comme suit:La façon la plus simple:
Le gestionnaire ne peut pas trouver votre didUpdateLocations méthode sans délégué de référence 😀
Mais n'oubliez pas de mettre à nouveau avant d'utiliser startUpdatingLocation
J'ai une situation similaire. Vous pouvez utiliser dispatch_once:
Vous pouvez utiliser une variable statique pour stocker la dernière position d'horodatage et de le comparer à la plus récente, comme ceci:
UIBackgroundTask
. Si vous voulez surveiller l'emplacement des mises à jour, vous devez utiliserstartMonitoringSignificantLocationChanges
.Écrire cette méthode lorsque vous souhaitez arrêter l'emplacement de mise à jour du gestionnaire de
pour la contrainte de temps, je n'ai pas compris le code de accepté de répondre, poster une approche différente. comme Rob points "Lorsque vous démarrez tout d'abord les services de localisation, vous pouvez le voir appelé à plusieurs reprises". le code ci-dessous agit sur le premier emplacement, et ignore les mises à jour des emplacements pour les 120 premières secondes. c'est une façon de s'attaquer original question "Comment arrêter plusieurs fois l'appel de méthode de didUpdateLocations".
dans .h fichier:
dans .m fichier:
Vous pourriez définir un indicateur (Bool). Lorsque vous instanciez votre locationsManager set flag = true", alors locationManager:didUpdateLocations retourne à l'intérieur d'un bloc de code
que vous souhaitez exécuter qu'une seule fois ensemble flag = false. De cette manière, il sera uniquement être exécuté à la fois.
endroits directeur sera appelé plusieurs fois, mais le code que vous voulez exécuter qu'une seule fois, et je pense que c'est ce que vous essayez d'atteindre?
locationManager.startUpdatingLocation() va chercher emplacement en continu et didUpdateLocations les appels de méthode à plusieurs reprises,
Il suffit de régler la valeur pour locationManager.distanceFilter valeur avant l'appel de locationManager.startUpdatingLocation().
Que j'ai mis 200 mètres(vous pouvez modifier selon vos besoins) fonctionne bien
vous pouvez écrire :
[gestionnaire de stopUpdatingLocation];
gestionnaire = nil;
dans didupdatelocation délégué