2012-08-31 2 views
0

필요할 때마다 현재 위치를 가져오고 위치 업데이트를 즉시 중지하려고합니다. 이를 위해 다음 코드를 작성했지만 휘발성 플래그를 기다리는 continuos는 작동하지 않는 것 같습니다. 내가 깃발을 기다릴 때 위치 업데이트가 실행되지 않습니다. 누군가 내 코드에서 잘못된 점을 알려주시겠습니까? 감사.iOS : 위치가 업데이트 될 때까지 계속 깃발을 대기 중입니다.

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; 
} 
+1

대리자 메소드는 위치 관리자를 시작한 동일한 스레드에서 실행되며 'sleepForTimeInterval'을 사용하여 차단합니다. –

+0

나는 이것에 대해 생각했지만 어쨌든 이것을 고칠 수 있습니까? – applefreak

+0

일반적인 방법은'while() {sleep} '부분을 제거하고'/ self.currentLocation 사용'작업을 관리자를 중지 한 후에'locationManager : didUpdateToLocation : fromLocation :'에서 호출 된 별도의 메소드로 옮기는 것입니다. 그것은 대표자의 가장 자연스러운 사용이며 그것을 사용하고자합니다. 그 외에도'locationUpdatedFlag' 키 패스에 옵서버를 추가하거나 여러분이했던 것처럼 수동으로 기다리는'separate' 스레드를 수동으로 생성하는 것과 같은 다른 솔루션이 많이 있습니다. –

답변

0

이 문제를 해결하는 일반적인 방법은 while(){sleep} 부분을 제거하고 locationManager:didUpdateToLocation:fromLocation:에서 호출 된 별도의 메서드로 // Use self.currentLocation operations을 이동하는 것입니다. 그것은 대표자의 가장 자연스러운 사용이며 그것을 사용하고자합니다. 그 외에도 관찰자를 locationUpdatedFlag keypath에 추가하거나 separate 스레드를 수동으로 생성하여 수면을 기다리는 것과 같은 다른 솔루션이 많이 있습니다.

0

이유 때문에 델리게이트 콜백이 있습니다 ... 무언가 완료되면 스레드 폴링을 잠글 필요가 없습니다. 더 이상 그렇게하지 않도록 수업 디자인을 변경하십시오. 문제가 해결 될 것이므로 사용자 환경이 개선 될 것입니다.

관련 문제