iOS:持续等待标志直到位置更新

时间:2012-08-31 11:16:34

标签: ios cllocationmanager volatile

我正在尝试在需要时获取当前位置并立即停止更新位置。为此,我编写了以下代码,但是在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;
}

2 个答案:

答案 0 :(得分:0)

你有一个委托回调是有原因的...所以你不必锁定线程轮询,如果有什么事情已经完成。改变你班级的设计,这样你就不再那样做了。我打赌它会解决你的问题,你会有更好的用户体验。

答案 1 :(得分:0)

解决此问题的常用方法是删除while(){sleep}部分,并在停止管理员后将// Use self.currentLocation operations移动到从locationManager:didUpdateToLocation:fromLocation:调用的单独方法中。这是代表最自然的用法,你会想要使用它。除此之外还有很多其他解决方案,例如将观察者添加到locationUpdatedFlag密钥路径或手动创建separate线程以等待它像你一样睡觉。