didUpdateLocations вместо didUpdateToLocation


с выпуском iOS6 Apple хочет, чтобы мы использовали didUpdateLocations вместо didUpdateToLocation. Может ли кто-нибудь объяснить, как правильно использовать didUpdateLocations?

6 63

6 ответов:

Я asume вы использовали следующий делегат, чтобы получить последнюю позицию?

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation

делегат выше устарел в iOS 6. Теперь следует использовать следующее:

- (void)locationManager:(CLLocationManager *)manager 
     didUpdateLocations:(NSArray *)locations

чтобы получить последнюю позицию, просто получите последний объект массива:

[locations lastObject]

другими словами, [locations lastObject] (новый делегат) равна newLocation (старый делегат) .

ни один из других ответов здесь не объясняет, почему существует массив locations и как правильно использовать новый didupdatelocations: массив, который предоставляется.

цель осуждения locationManager:didUpdateToLocation:fromLocation: и отправка NSArray местоположений вместо этого заключается в снижении энергопотребления при работе в фоновом режиме.

начиная с iPhone 5, чип GPS имеет возможность хранить местоположения в течение определенного периода времени, а затем доставлять их все сразу в массиве. Это называется отложенные обновления местоположения. Это позволяет основному процессору спать в течение более длительного периода времени, находясь в фоновом режиме. Это означает, что iOS не нужно запускать основной процессор для каждого обновления позиции, процессор может спать, в то время как чип GPS собирает местоположения.

вы можете проверить эту возможность с помощью deferredLocationUpdatesAvailable метод. Если вы можете включить его с помощью allowDeferredLocationUpdatesUntilTraveled:timeout: метод. Некоторые условия применяются, см. ответ для сведения.

это дает вам массив объектов для доступа к последнему местоположению, которое вы можете использовать

[locations lastObject]

из этого метода делегата

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

вот как метод может быть реализован, чтобы работать так же, как устаревший

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations.lastObject;
    CLLocation *oldLocation;
    if (locations.count > 1) {
        oldLocation = locations[locations.count - 2];
    }
}

Если вы поддерживаете iOS 5 и 6, Вы должны позвонить

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations, 

старшего

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

примечательно, что массив объектов CLLocation, возвращенный locationManager: didUpdateLocations: может включать или не включать прежнее местоположение. Другими словами, в редких случаях в массиве может быть только одно местоположение. Используйте следующее, чтобы проверить, и если есть более одного объекта, мы можем получить самое последнее предыдущее местоположение:

int objCount = [locations count];
if (objCount > 1) {
    CLLocation *oldLocation = [locations objectAtIndex:objCount - 1];
}

поскольку в массиве будет хотя бы один объект, извлечение текущего местоположения выполняется путем запроса последнего объекта в массиве матрица. Даже если последний объект является единственным объектом, это нормально:

CLLocation *newLocation = [locations lastObject];

имейте в виду, что поскольку это массив, oldLocation в примере, показанном выше, не обязательно будет тем, который вы ищете. Это зависит от того, как вы setDistanceFilter: и desiredAccuracy: properties, поскольку эти свойства будут влиять на заполнение массива locations. Желаемый oldLocation может быть похоронен глубже в массиве.