didUpdateToLocation调用多个

时间:2012-03-22 11:51:55

标签: objective-c ios

我有一个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被调用两次,我只想称它为一次。我怎么能这样做?谢谢你的回答

4 个答案:

答案 0 :(得分:11)

要确保locationManager仅调用“didUpdate ...”方法一次,请使用BOOL引用该位置是否已找到。

  1. 创建ivar BOOL:

    @property BOOL didFindLocation;
    
  2. 在locationManager startUpdatingLocation之前,将新BOOL设置为NO。这样您就可以随意调用新的位置更新。

    -(void) startFindingLocation {
    
        self.didFindLocation = NO; // like this
    
        locationManager = [[CLLocationManager alloc] init];
        [locationManager setDelegate:self]
        [locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
        [locationManager startUpdatingLocation];
    }
    
  3. 在“didUpdateLocations”中,检查它。

    - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    
        if (!self.didFindLocation) {
            self.didFindLocation = YES;
            [locationManager stopUpdatingLocation];
    
            // do the rest of your stuff
    
        }
    }
    
  4. 如果可能,请不要在代码中的任何其他位置设置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()