С выпуском iOS6 Apple хочет, чтобы мы использовали didUpdateLocations вместо didUpdateToLocation. Кто-нибудь может объяснить, как правильно использовать didUpdateLocations?
didUpdateLocations вместо didUpdateToLocation
Ответы (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 (старый делегат).
Ни один из других ответов здесь не объясняет, почему существует массив местоположений и как правильно использовать новый предоставленный массив didUpdateLocations:.
Цель отказа от locationManager:didUpdateToLocation:fromLocation: и отправки NSArray местоположений — снизить энергопотребление при работе в фоновом режиме.
Начиная с iPhone 5, чип GPS имеет возможность сохранять местоположения в течение определенного периода времени, а затем передавать их все сразу в виде массива. Это называется отложенными обновлениями местоположения. Это позволяет основному ЦП спать в течение более длительного периода времени, находясь в фоновом режиме. Это означает, что iOS не нужно запускать основной процессор для каждого обновления местоположения, процессор может спать, пока чип GPS собирает местоположения.
Вы можете проверить эту возможность, используя deferredLocationUpdatesAvailable. Если доступно, вы можете включить его с помощью метода allowDeferredLocationUpdatesUntilTraveled:timeout:. Применяются некоторые условия, подробности см. в этом ответе.
Он дает вам массив объектов для доступа к последнему местоположению, которое вы можете использовать.
[locations lastObject]
из этого метода делегата
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
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];
}
}
Если вы поддерживаете 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 в показанном выше примере не обязательно будет тем, что вы ищете. Это зависит от того, как вы устанавливаете свойства DistanceFilter: и requiredAccuracy:, так как эти свойства будут влиять на то, как заполняется ваш массив местоположений. Желаемый oldLocation может быть спрятан глубже в массиве.