Bezdepbonusu7Программирование: статьи и ответы

Вопрос

DidUpdateLocations вместо didUpdateToLocation

Автор вопроса: YogevSittonОтветов: 6

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

iosswiftobjective-ccore-locationcllocationmanager

Ответы

Ответ 1 · рейтинг 126 · Anne

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

- (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 · рейтинг 65 · progrmr

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

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

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

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

Ответ 3 · рейтинг 22 · Janak Nirmal

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

[locations lastObject]

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

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

Ответ 4 · рейтинг 7 · Groot

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

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

Ответ 5 · рейтинг 3 · Mustafa

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

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

от старшего

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

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

Ответ 6 · рейтинг 2 · bitsand

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

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

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

CLLocation *newLocation = [locations lastObject];

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы