我正在尝试在需要时获取当前位置并立即停止更新位置。为此,我编写了以下代码,但是在volatile标志上等待的似乎并不起作用。当我在等待旗帜时,它不会触发位置更新。有人可以告诉我我的代码有什么问题。感谢。
CurrentLocation.h file:
@property (nonatomic, assign) volatile BOOL locationUpdatedFlag;
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLLocation *currentLocation;
CurrentLocation.m file:
@synthesize currentLocation = _currentLocation;
@synthesize locationManager = _locationManager;
@synthesize locationUpdatedFlag = _locationUpdatedFlag;
- (void)xxx
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
[self.locationManager startUpdatingLocation];
self.locationUpdatedFlag = NO;
while(!self.locationUpdatedFlag)
[NSThread sleepForTimeInterval:.1];
// Use self.currentLocation
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
self.currentLocation = newLocation;
self.locationUpdatedFlag = YES;
[manager stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"Error from Location Manager");
self.locationUpdatedFlag = YES;
}
答案 0 :(得分:0)
你有一个委托回调是有原因的...所以你不必锁定线程轮询,如果有什么事情已经完成。改变你班级的设计,这样你就不再那样做了。我打赌它会解决你的问题,你会有更好的用户体验。
答案 1 :(得分:0)
解决此问题的常用方法是删除while(){sleep}
部分,并在停止管理员后将// Use self.currentLocation operations
移动到从locationManager:didUpdateToLocation:fromLocation:
调用的单独方法中。这是代表最自然的用法,你会想要使用它。除此之外还有很多其他解决方案,例如将观察者添加到locationUpdatedFlag
密钥路径或手动创建separate
线程以等待它像你一样睡觉。