iOS - CLLocation Manager didUpdateLocations 调用了太多时间
Posted
技术标签:
【中文标题】iOS - CLLocation Manager didUpdateLocations 调用了太多时间【英文标题】:iOS - CLLocation Manager didUpdateLocations called too much time 【发布时间】:2017-03-02 10:04:39 【问题描述】:我正在重构旧代码以使事情变得干净,尤其是地理位置部分,现在有点混乱。
我正在记录每个地理定位方法,我发现didUpdateLocations
的调用时间过长。
这是我的启动画面中的一些代码:
- (void)viewDidLoad
[super viewDidLoad];
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[self startLocationRetrieval];
这里是startLocationRetrieval
方法
-(void) startLocationRetrieval
if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
[_locationManager requestWhenInUseAuthorization];
if ([CLLocationManager locationServicesEnabled])
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];
else
_isDataLoaded = YES;
[self loadHomeView];
这里是 CLLocation 委托方法
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
DDLogError(@"GEOLOC CLLocationManager didFailWithError: %@", error);
[self loadHomeView];
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
DDLogInfo(@"GEOLOC Splashscreen didUpdateLocations -> %@", locations);
[self manageNewLocation:[locations lastObject]];
还有我处理位置变化的方法
-(void) manageNewLocation:(CLLocation *)location
_coordinate = location;
DDLogDebug(@"GEOLOC Splash manageNewLocation = %@", _coordinate);
[self loadHomeView];
loadHomeView 方法只是触发 performSegueWithIdentifier 以进入主页。
您认为这是一个好的实现还是更简洁? 我应该在哪里stopUpdatingLocation
?
我发现了这个类似的问题ios didUpdateLocations。但是NSTimer
是正确的方法吗,看起来很笨重。
【问题讨论】:
查看***.com/questions/22292835/… 【参考方案1】:获取位置后,您需要使用 [manager stopUpdatingLocation];
停止更新位置
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
[manager stopUpdatingLocation];
manager = nil;
DDLogInfo(@"GEOLOC Splashscreen didUpdateLocations -> %@", locations);
[self manageNewLocation:[locations lastObject]];
【讨论】:
好的,我想知道应该在哪里调用 stopUpdatingMethod。 manager = nil 是为了什么? @Murloc - 获取您的位置后,您使用了stopUpdatingMethod
,它会停止获取另一次,如果您使用的是manager = nil
,您正在释放_locationManager = [[CLLocationManager alloc] init];
的内存,在这里,我们采用代表的本地/实例名称(CLLocationManager *)manager
谢谢。干净而完美的答案。以上是关于iOS - CLLocation Manager didUpdateLocations 调用了太多时间的主要内容,如果未能解决你的问题,请参考以下文章
CLLocation Manager 有时会给出不正确的位置
未调用 CLLocation Manager didStartMonitoringForRegion 委托方法
CLLocation Manager 检查 requestAlwaysAuthorization 如果不接受退出应用