С выпуском iOS6 Apple хочет, чтобы мы использовали didUpdateLocations вместо didUpdateToLocation. Может ли кто-нибудь объяснить, как правильно использовать didUpdateLocations?
Ответ 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 может быть похоронен глубже в массиве.