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