Подтвердить что ты не робот

DidUpdateLocations вместо didUpdateToLocation

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

4b9b3361

Ответ 1

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

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

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

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

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

[locations lastObject]

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

Ответ 2

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

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

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

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

Ответ 3

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

[locations lastObject]

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

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

Ответ 4

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

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

Ответ 5

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

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

от более старого

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

создав массив местоположений.

Ответ 6

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

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

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

CLLocation *newLocation = [locations lastObject];

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