如何在ios中多次停止didUpdateLocations()的方法调用

这个我的代码……

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

这种方法是多次调用,我不想…..

在那里添加一些限制。 地点之间的时间跨度和准确性

 -(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]; _currentLocation = newLocation; if(distance > 20) { //significant location update } //location updated } 

分配LocationManager对象时,可以设置LocationManagerdistanceFilter属性。 距离filter属性是一个CLLocationDistance值,可以设置为通知位置pipe理器关于以米为单位移动的距离。 您可以如下设置距离filter:

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

最简单的方法是:

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

如果没有委托引用:-D,经理无法find您的didUpdateLocations方法

但是在使用startUpdatingLocation之前不要忘记重新设置它

我有类似的情况。 你可以使用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 }); } 

您可以使用静态variables来存储最新的位置时间戳,然后将其与最新的时间戳进行比较,如下所示:

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

当你想停止更新位置pipe理器的时候写这个方法

 [locationManager stopUpdatingLocation]; 

对于时间的限制,我不明白从接受的答案的代码,发布一个不同的方法。 正如Rob指出的那样:“当您第一次启动位置服务时,您可能会看到它多次被调用”。 下面的代码作用于第一个位置,并忽略前120秒的更新位置。 它是解决原始问题“如何多次停止didUpdateLocations的方法调用”的一种方法。

在.h文件中:

 @property(strong,nonatomic) CLLocation* firstLocation; 

在.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 

你可以设置一个标志(布尔)。 当你实例化你的locationsManager set flag = true时,那么当locationManager:didUpdateLocations在一个代码块内返回时,你只想运行一次set flag = false。 这样它只会运行一次。

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

地点经理会被多次调用,但是您只想执行一次代码,我想这就是您想要实现的目标?

locationManager.startUpdatingLocation()连续获取位置,didUpdateLocations方法多次调用,只需在调用locationManager.startUpdatingLocation()之前设置locationManager.distanceFilter值的值即可。

当我设置200米(你可以改变你的要求)工作正常

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