didUpdateLocations вместо didUpdateToLocation

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


person YogevSitton    schedule 26.09.2012    source источник


Ответы (6)


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

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

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

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

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

[locations lastObject]

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

person Anne    schedule 26.09.2012
comment
@Энн, а как насчет старого места? - person S.J; 28.04.2013
comment
@SJ, вы можете получить старое местоположение, сохранив его из предыдущего вызова метода делегата. В конце ответа здесь есть пример. - person progrmr; 23.07.2013
comment
Разве объект oldLocation не будет предпоследним объектом в массиве? - person kraftydevil; 20.10.2014
comment
Это все еще объект CLLocation? или NSString? - person windsound; 15.11.2014
comment
@windsound Да [locations lastObject] является объектом CLLocation. - person Kamleshwar; 11.07.2016
comment
но как мы можем извлечь координату из массива, я имею в виду долготу и широту? - person tryKuldeepTanwar; 26.07.2016

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

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

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

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

person progrmr    schedule 23.07.2013
comment
Спасибо за объяснение изменения. - person Kenny; 30.07.2013
comment
Это был ответ, который я действительно хотел знать. Спасибо. - person NightFury; 29.01.2014

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

[locations lastObject]

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

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
person Janak Nirmal    schedule 26.09.2012
comment
а как насчет старой локации? как это получить? - person S.J; 28.04.2013
comment
Это (старое местоположение) больше не предоставляется в этом вызове iOS6. Обычно я сохраняю самое текущее местоположение в переменной экземпляра с именем old_location, если мне нужно сравнить. По прибытии в новое место я сравниваю с переменной экземпляра old_location и что-то делаю... или нет. Затем я обновляю этот old_location новым, только что предоставленным мне. Это позволяет old_location синхронизироваться с последним известным местоположением. - person Jann; 10.05.2013

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

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

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

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

от старшего

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

функцию, создав массив местоположений.

person Mustafa    schedule 12.10.2012

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

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

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

CLLocation *newLocation = [locations lastObject];

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

person bitsand    schedule 05.05.2014