我有一个程序,位置管理器设置如下:
self.locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
我需要精度到十米以内,然而,需要几次调用didUpdateToLocation委托方法才能找到准确度的位置。如何延迟调用此方法或仅指示何时达到所需的准确度以继续执行该程序。
现在它尝试继续返回的第一个位置。即使第二次更新位置也不如预期的那么准确。
提前致谢!
答案 0 :(得分:7)
由于每个委托调用包含一个准确度数字,只需从方法返回,直到达到所需的准确度(警告:可能永远不会发生)。
你不能简单地跳到十米的结果 - 这就是为什么它被称为“所需”的准确性而非强制性的准确性。你必须给它时间来计算更准确的位置。
答案 1 :(得分:4)
我最近解决了这个问题并通过巧妙地阅读文档发现了,CoreLocation在一个单独的线程中运行,因此您可以启动它,然后在更新时检索事件。它位于标题"Getting the User's Location"下的文档中。所以这里是你开始更新的地方:
- (void)startStandardUpdates
{
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = none;
[locationManager startUpdatingLocation];
}
如果您将委托设为“self”,它会将事件发送到定义了start方法的同一个类,因此您只需要添加以下内容来检索事件:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (newLocation.horizontalAccuracy < 30.0)
{
NSLog(@"latitude %+.6f, longitude %+.6f\n",
newLocation.coordinate.latitude,
newLocation.coordinate.longitude);
[manager stopUpdatingLocation];
}
}
这样它将继续接收事件,然后关闭GPS接收器以节省能量。当然,如果它超时,它需要一段时间以某种方式来存储和接受具有最佳水平精度的位置,但我还没有想出如何做到这一点。
答案 2 :(得分:2)
一种策略是启动计时器足够长的时间以获得修复(用户也可以接受)
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
启动位置管理器提供更新。当计时器到期时(或者您获得可接受的准确度)停止更新并使用该位置。
这可能是你得到的最好的。如果位置仍然不够准确,您可能希望为用户提供再次尝试的选项。