iOS — CLLocation Manager вызывал слишком много времени UpdateLocations

Я рефакторинг старого кода, чтобы сделать вещи чистыми, особенно часть геолокации, которая сейчас довольно беспорядочна.

Я регистрирую все методы геолокации и обнаружил, что didUpdateLocations вызывается слишком долго.

Вот некоторый код из моего Splashscreen:

- (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 правильный путь, он кажется неуклюжим.


person Community    schedule 02.03.2017    source источник
comment
Проверьте этот stackoverflow.com/questions/22292835/   -  person kb920    schedule 02.03.2017


Ответы (1)


после получения местоположения вам нужно остановить обновление местоположения, используя [manager stopUpdatingLocation];

  - (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
       [manager stopUpdatingLocation];
       manager = nil;
    DDLogInfo(@"GEOLOC Splashscreen didUpdateLocations -> %@", locations);
    [self manageNewLocation:[locations lastObject]];
}
person Anbu.Karthik    schedule 02.03.2017
comment
Хорошо, отлично, я хотел знать, где именно должен вызываться метод stopUpdatingMethod. Менеджер = nil для чего? - person ; 02.03.2017
comment
@Murloc - после того, как ваше местоположение было получено, вы использовали stopUpdatingMethod, это остановка для получения еще одного раза, если вы используете manager = nil , вы освобождаете память своего _locationManager = [[CLLocationManager alloc] init];, здесь мы берем локальное имя/имя экземпляра делегатов (CLLocationManager *)manager - person Anbu.Karthik; 02.03.2017
comment
Спасибо. Чистый и идеальный ответ. - person ; 02.03.2017