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如何在一定距离后更新

未调用 CLLocation Manager didStartMonitoringForRegion 委托方法

CLLocation Manager 检查 requestAlwaysAuthorization 如果不接受退出应用

CLLocation Manager 使用默认位置而不是使用实际位置进行更新

Swift 中的 CLLocation 管理器获取用户的位置