Cómo detener varias veces el método de llamada de didUpdateLocations () en ios

Este es mi código ……

-(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; } 

Este método es llamar varias veces que no quiero …..

Agrega alguna restricción allí. Por intervalo de tiempo entre ubicaciones y precisión

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *newLocation = locations.lastObject; NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; if (locationAge > 5.0) return; if (newLocation.horizontalAccuracy < 0) return; // Needed to filter cached and too old locations //NSLog(@"Location updated to = %@", newLocation); CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:_currentLocation.coordinate.latitude longitude:_currentLocation.coordinate.longitude]; CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude]; double distance = [loc1 distanceFromLocation:loc2]; if(distance > 20) { _currentLocation = newLocation; //significant location update } //location updated } 

Al asignar su objeto LocationManager , puede establecer la propiedad distanceFilter del LocationManager . La propiedad de filtro de distancia es un valor CLLocationDistance que se puede configurar para notificar al administrador de ubicación sobre la distancia movida en metros. Puede configurar el filtro de distancia de la siguiente manera:

 LocationManager *locationManger = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = 100.0; // Will notify the LocationManager every 100 meters locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

La forma más fácil:

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { [manager stopUpdatingLocation]; manager.delegate = nil; //...... do something } 

El administrador no puede encontrar su método didUpdateLocations sin la referencia del delegado 😀

Pero no olvide volver a configurarlo antes de usar startUpdatingLocation

Tengo una situación similar. Puede usar dispatch_once:

 static dispatch_once_t predicate; - (void)update { if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined && [_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [_locationManager requestWhenInUseAuthorization]; } _locationManager.delegate = self; _locationManager.distanceFilter = kCLDistanceFilterNone; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; predicate = 0; [_locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { [manager stopUpdatingLocation]; manager = nil; dispatch_once(&predicate, ^{ //your code here }); } 

Puede usar una variable estática para almacenar la última marca de hora de ubicación y luego compararla con la más nueva, como esta:

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { [manager stopUpdatingLocation]; static NSDate *previousLocationTimestamp; CLLocation *location = [locations lastObject]; if (previousLocationTimestamp && [location.timestamp timeIntervalSinceDate:previousLocationTimestamp] < 2.0) { NSLog(@"didUpdateLocations GIVE UP"); return; } previousLocationTimestamp = location.timestamp; NSLog(@"didUpdateLocations GOOD"); // Do your code here } 

Escriba este método cuando quiera dejar de actualizar el administrador de la ubicación

 [locationManager stopUpdatingLocation]; 

para la restricción de tiempo, no entendí el código de la respuesta aceptada, publicando un enfoque diferente. como señala Rob “Cuando comienzas los servicios de ubicación, es posible que lo veas varias veces”. el siguiente código actúa en la primera ubicación e ignora las ubicaciones actualizadas durante los primeros 120 segundos. es una forma de abordar la pregunta original “Cómo detener la llamada al método de múltiples veces de didUpdateLocations”.

en archivo .h:

 @property(strong,nonatomic) CLLocation* firstLocation; 

en archivo .m:

 // is this the first location? CLLocation* newLocation = locations.lastObject; if (self.firstLocation) { // app already has a location NSTimeInterval locationAge = [newLocation.timestamp timeIntervalSinceDate:self.firstLocation.timestamp]; NSLog(@"locationAge: %f",locationAge); if (locationAge < 120.0) { // 120 is in seconds or milliseconds? return; } } else { self.firstLocation = newLocation; } // do something with location 

Puede establecer un indicador (Bool). Cuando instancia su ubicaciónManager set flag = true, entonces cuando locationManager: didUpdateLocations regresa dentro de un bloque de código que desea ejecutar solo una vez establece flag = false. De esta forma solo se ejecutará una vez.

  if flag == true { flag = false ...some code probably network call you only want to run the once } 

El administrador de ubicaciones se llamará varias veces pero el código que desea ejecutar solo una vez, y creo que eso es lo que está tratando de lograr.

locationManager.startUpdatingLocation () busca la ubicación continuamente y el método didUpdateLocations llama varias veces, solo establece el valor de locationManager.distanceFilter value antes de llamar a locationManager.startUpdatingLocation ().

Cuando establecí 200 metros (puedes cambiar según tus necesidades) trabajando bien

  locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.distanceFilter = 200 locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() 

puede escribir: [gestor stopUpdatingLocation]; gerente = nil; en didupdatelocation delegado

    Intereting Posts