didUpdateToLocation多次调用

时间:2013-05-06 12:12:30

标签: iphone ios cllocationmanager

This screenshot taken with no movement of device 我有一个应用程序,用户在慢跑或骑自行车时跟踪他/她的路线,所以我需要完美的位置,所以用户的路线将是完美的。

但是,我有一个问题,

locManager = [[CLLocationManager alloc] init];
[locManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[locManager setDelegate:self];
[locManager startUpdatingLocation];

在viewDidLoad中。使用这个多次调用的didUpdateToLocation方法,当我只是移动设备一点点并在地图上非常奇怪的路线绘制。

我无法理解为什么会发生这种情况,如果我做错了什么或遗失了什么。

感谢.......

8 个答案:

答案 0 :(得分:15)

我使用locationManager.distanceFilter = 500; (左右)//米  防止多次通话发生。只需记住在开始更新位置之前调用此信息

答案 1 :(得分:2)

当您第一次启动位置服务时,无论您是否移动,通常都会看到多个位置更新。如果您检查位置的horizontalAccuracy,您会看到它在“变暖”时会显示一系列具有越来越高精度的位置(即越来越小horizontalAccuracy值)直到它达到静止状态。

horizontalAccuracy低于某个值之前,您可以忽略这些初始位置。或者,更好的是,在启动期间,如果(a)新位置与旧位置之间的距离小于旧位置的horizontalAccuracy,则可忽略之前的位置;(b){{1新位置的位置小于先前位置的位置。


例如,假设您正在维护一组horizontalAccuracy个对象,以及对最后绘制路径的引用:

CLLocation

此外,我们假设您的位置更新例程只是添加到位置数组,然后指示应重绘路径:

@property (nonatomic, strong) NSMutableArray *locations;
@property (nonatomic, weak) id<MKOverlay> pathOverlay;

然后- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"%s", __FUNCTION__); CLLocation* location = [locations lastObject]; [self.locations addObject:location]; [self addPathToMapView:self.mapView]; } 可以从最后一个位置删除第二个,如果它不如最后一个位置,并且它们之间的距离小于最近位置的准确度。

addPathToMapView

最重要的是,摆脱不如下一个位置准确的位置。如果你愿意的话,你可以在修剪过程中变得更加积极,但是那里有权衡,但希望这说明了这个想法。

答案 2 :(得分:2)

您可以设置位置管理器的distancefilter,希望这可以帮助您

 locationManager=[[CLLocationManager alloc] init];
 locationManager.delegate=self;
 locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
 locationManager.distanceFilter=10.0;

 [locationManager startUpdatingLocation];

答案 3 :(得分:1)

startUpdatingLocation 

即使位置没有变化,也会不断更新用户的位置。您只需根据需要构建应用程序以处理这些持续更新。

尝试阅读有关此主题的Apple文档。起初很混乱,但无论如何都要尝试。

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

答案 4 :(得分:0)

我认为这就是你所需要的。startMonitoringForRegion:desiredAccuracy

示例请参阅以下github链接。

答案 5 :(得分:0)

答案 6 :(得分:0)

添加此内容,

[locManager stopUpdatingLocation];

进入updateUserLocation委托方法。

查看以下代码段:

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [_locationManager stopUpdatingLocation];        
}

答案 7 :(得分:0)

locationManager.startUpdatingLocation()连续获取位置并且didUpdateLocations方法多次调用, 只需在调用locationManager.startUpdatingLocation()之前设置locationManager.distanceFilter值的值。

因为我设置200工作正常

    locationManager.distanceFilter = 200
    locationManager.startUpdatingLocation()