我有一个iOS应用程序,它使用用户的当前位置。我这样做:
-(void)startGeoloc{
NSLog(@"start geoloc");
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyHundredMeters;
[locationManager startUpdatingLocation];
}
#pragma mark - CLLocationManagerDelegate methods
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[locationManager stopUpdatingLocation];
AppDelegate *apDelegate =(AppDelegate *)[UIApplication sharedApplication].delegate;
apDelegate.modeGeoloc = YES;
[self callWebService:locationManager.location];
}
问题在于,我的方法callWebService:locationManager.location
被调用两次,我只想称它为一次。我怎么能这样做?谢谢你的回答
答案 0 :(得分:11)
要确保locationManager仅调用“didUpdate ...”方法一次,请使用BOOL引用该位置是否已找到。
创建ivar BOOL:
@property BOOL didFindLocation;
在locationManager startUpdatingLocation之前,将新BOOL设置为NO。这样您就可以随意调用新的位置更新。
-(void) startFindingLocation {
self.didFindLocation = NO; // like this
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self]
[locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
[locationManager startUpdatingLocation];
}
在“didUpdateLocations”中,检查它。
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
if (!self.didFindLocation) {
self.didFindLocation = YES;
[locationManager stopUpdatingLocation];
// do the rest of your stuff
}
}
如果可能,请不要在代码中的任何其他位置设置didFindLocation以避免混淆。
答案 1 :(得分:4)
可以非常频繁地调用locationManager委托方法(它们始终didUpdateToLocation
,对吧?:)
一种方法是让你的callWebService
拥有状态,知道它当前是否正在执行请求,并忽略并发请求(如果还有)。另一种方法是保留时间戳,并且只有在从前一个时间过去2分钟后才允许它通过。
答案 2 :(得分:0)
有同样的问题。
我认为最简单的解决方案是将CLLocationManager设置为null。
locationManager = nil;
之后
[locationManager stopUpdatingLocation];
答案 3 :(得分:0)
locationManager.startUpdatingLocation()连续获取位置并且didUpdateLocations方法多次调用, 只需在调用locationManager.startUpdatingLocation()之前设置locationManager.distanceFilter值的值。
当我设置100米(你可以根据你的要求改变)工作正常,并将为你工作。
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = 100
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()