0

必要に応じて現在地を取得し、すぐに現在地の更新を停止しようとしています。このために私は次のコードを書きましたが、揮発性フラグを待っている連続体は機能していないようです。旗を待っているときでも、位置情報の更新は発生しません。誰かが私のコードの何が問題なのか教えてもらえますか?ありがとう。

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

2 に答える 2

0

ある理由でそのデリゲートコールバックがあります...したがって、何かが終了した場合にスレッドのポーリングをロックする必要はありません。クラスのデザインを変更して、もうそれを行わないようにします。私はそれがあなたの問題を解決し、あなたがより良いユーザーエクスペリエンスを持つことになるに違いない。

于 2012-08-31T11:22:41.377 に答える
0

これを修正する一般的な方法は、パーツを削除し、マネージャーを停止した後に呼び出される別のメソッドにwhile(){sleep}移動することです。これがデリゲートの最も自然な使用法であり、使用することをお勧めします。それ以外にも、キーパスにオブザーバーを追加したり、スレッドを手動で作成して、実行したようにスリープ状態になるのを待つなど、他にも多くの解決策があります。// Use self.currentLocation operationslocationManager:didUpdateToLocation:fromLocation:locationUpdatedFlagseparate

于 2012-09-02T09:40:54.040 に答える