1
{
...
locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        NSLog(@"myLocation1: %@",[locations lastObject]);
        myLocation = [locations lastObject];
        NSLog(@"myLocation2: %@",[locations lastObject]);
        [manager stopUpdatingLocation];

        [self doSomethingWithLocation];    
}

目前我在位置 40.000,40.000。我正在关闭我的应用程序并将位置更改为 10.000,10.000

当再次进入应用程序并运行[locationManager startUpdatingLocation];我的日志将显示:

myLocation1: <+40.00000000,+40.00000000>
myLocation2: <+40.00000000,+40.00000000>

如果我[locationManager startUpdatingLocation];再次触发,我的日志将显示:

myLocation1: <+10.00000000,+10.00000000>
myLocation2: <+10.00000000,+10.00000000>

我怎样才能调用didUpdateLocations一次并仍然获得当前位置?我应该使用另一个代表吗?

我想我可以放在stopUpdatingLocation里面doSomethingWithLocationdoSomethingWithLocation在某种延迟后运行,以便更新正确的位置,但我确信这不是它的本意。

谢谢

4

3 回答 3

7

让位置管理器运行一段时间(例如 30 秒),设置一个计时器让它停止。位置管理器更新就像煎饼,你得到的第一个并不总是最好的。

于 2013-09-17T19:17:36.647 回答
1

您看到的第一个更新可能是一个“陈旧”的位置,这是在几分钟前上次启动位置服务时确定的。或者,例如,它可能是使用蜂窝塔定位确定的非常不准确的位置。如果您只需要获取设备的当前位置,那么直接使用 Core Location 需要大量代码,因为您必须处理这些情况。(CLLocationManager API 似乎是为需要持续位置更新的应用程序构建的,例如逐向 GPS 导航应用程序。)

我建议您不要直接使用 CLLocationManager,而是考虑使用开源组件,例如 INTULocationManager,它将为您处理所有这些工作,并使请求设备当前位置的一个或多个离散请求变得非常简单。

于 2014-03-29T19:04:01.347 回答
0

在这种情况下,您应该检查位置的时间戳。用户不会如此迅速地在这样的距离上移动。

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        CLLocation *location = [locations lastObject];
        if(fabs([location.timestamp timeIntervalSinceNow]) < 5)//seconds
        {
            myLocation = location;
            manager.delegate = nil;
            [manager stopUpdatingLocation];
            [self doSomethingWithLocation];
        }
}
于 2013-09-17T20:32:50.290 回答