{
...
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
置于doSomethingWithLocation
内并在经过某种延迟后运行doSomethingWithLocation
以便更新正确的位置,但我确信这不是它的方式意思是。
由于
答案 0 :(得分:7)
让位置管理器运行一段时间(例如30秒),设置一个计时器告诉它停止。位置管理器更新就像煎饼,你得到的第一个并不总是最好的。
答案 1 :(得分:1)
您看到的第一个更新可能是一个“陈旧”的位置,这是在几分钟前定位服务上次启动时确定的。或者,例如,它可能是使用蜂窝塔定位确定的非常不准确的位置。如果您只需要获取设备的当前位置,则直接使用Core Location需要大量代码,因为您必须处理这些情况。 (CLLocationManager API似乎是为需要连续位置更新的应用程序构建的,例如转弯GPS导航应用程序。)
我建议您不要直接使用CLLocationManager,而是使用open source component such as INTULocationManager来处理所有这些工作,并且可以轻松地为设备的当前位置请求一个或多个离散请求。
答案 2 :(得分: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];
}
}