Как я могу получить CLLLocationManager для немедленного возврата с указанием местоположения? - PullRequest
0 голосов
/ 15 октября 2011

Я пытаюсь настроить мои параметры CLLocationManager, чтобы при вызове startUpdatingLocation он сразу вызывал делегата.Есть идеи, как это сделать?

Ответы [ 3 ]

2 голосов
/ 15 октября 2011

Это невозможно. Причина проста: устройство не имеет фиксированной позиции, которая соответствует желаемой точности все время. Для этого может потребоваться включение GPS-чипа, который также занимает некоторое время для определения местоположения (без дополнительной информации и устаревшего альманаха в худшем случае это может занять до 15 минут).

0 голосов
/ 15 октября 2011

Это, безусловно, НЕ лучший способ (даже не очень хороший способ) использовать CLLocationManager, и когда я найду время, я планирую вернуться и изменить свой код, чтобы иметь толькоодин CLLocationManager в моем AppDelegate и все подчиненные контроллеры вызова вызывают AppDelegate для своих нужд местоположения.

У меня есть следующий код в контроллере представления (не главный контроллер или делегат приложения), и оЧерез 5-10 секунд после нажатия контроллера вида моим главным навигационным контроллером видов он начинает запись в NSLog с точным длинным / широтно-указательным значением моей позиции (т. Е. Метод делегата locationManager:didUpdateToLocation:fromLocation: начинает вызываться):

- (void)viewDidLoad {
    [super viewDidLoad];
    // ....
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    [locationManager setDelegate:self];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager startUpdatingLocation];
    // ....
}

// This will be called just a few seconds after the view appears and the
//  location is accurate (if I have location services on and good sky-line of sight)
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
    if (abs(howRecent) < 5.0) {
        self.latitude  = [NSNumber numberWithDouble:newLocation.coordinate.latitude];
        self.longitude = [NSNumber numberWithDouble:newLocation.coordinate.longitude];
        NSLog(@"New Latitude %+.6f, Longitude %+.6f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
    }
}

// Then, tear down the location Manager (so I can use it in another view controller)
// A bit excessive possibly, but I like to be absolutely sure that my App does not use the GPS
//  when it doesn't need it to save batter life.
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager stopUpdatingHeading];
    [locationManager stopUpdatingLocation];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager stopUpdatingHeading];
    [locationManager stopUpdatingLocation];
}

- (void)viewDidUnload {
    [locationManager stopUpdatingLocation];
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager stopUpdatingHeading];
    [locationManager setDelegate:nil];
    self.locationManager = nil;
}

- (void)dealloc {
    // ....
    [locationManager stopUpdatingLocation];
    [locationManager setDelegate:nil];
    [locationManager release], locationManager = nil;
    // ....
    [super dealloc];
}

Затем в таких местах, как actionSheet:clickedButtonAtIndex:, я могу получить значения местоположения on0demand с locationManager.location.coordinate.latitude / locationManager.location.coordinate.longitude или self.latitude / self.longitude.

0 голосов
/ 15 октября 2011

Невозможно настроить CLLocationManger таким образом.Тем не менее, вы можете написать оболочку для CLLocationManager, которая получает текущую позицию при запуске и возвращает ее каждый раз, когда вы ее запрашиваете.Однако могут быть ситуации, когда местоположение (пока) недоступно, и этот подход довольно энергоемкий, поскольку вы постоянно используете GPS-устройство.

...