2014-01-05 2 views
0

Я использую CoreLocation, чтобы захватить местоположение пользователя. Мне нужно захватить местоположение пользователя, а затем отправить его на сервер. У меня все работает, но! Я внедряю locationManager:(CCLLocationManager *)manager...Убедитесь, что locationManager завершен, затем выполните запрос

Мой запрос на URL-адрес попадает до того, как местоположение найдено. Что лучший способ:

  • Запрос местоположение
  • магазина в строке
  • Отправить строку для запроса

Я хочу, чтобы обеспечить место находится перед его послан. Я проверяю экземпляр класса с условным и внутри блока, попавшего на сервер. Я не нужно постоянно обновлять, просто захватить один раз и stopUpdatingLocation

Собиралась через этот пост ранее: Getting Longitude/Latitude of the User When the viewDidLoad

То, что я до сих пор:

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; 

    [locationManager startUpdatingLocation]; 

    ...more below... server request below here 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) { 
     NSLog(@"found!"); 
     [locationManager stopUpdatingLocation]; 
    } 
} 

Мысли о том, как сделать это? Я думаю, что условие может работать, но не уверен, что есть правильный способ справиться с этим, используя методы, предоставленные из CoreLocation.

ответ

0

Создайте новый метод, который будет выполнять ваш зависимый от местоположения код. Затем, как только у вас есть местоположение (I.e. После строки NSLog (@ "found!")) Вызовите этот метод.

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

Например:

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; 

    [locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) 
    { 
     NSLog(@"found!"); 
     [self handleLocation:newLocation]; 
     [locationManager stopUpdatingLocation]; 
    } 
} 

- (void)handleLocation:(CLLocation*)location 
{ 
    // handling code here 
} 
0

Расположение Менеджер является асинхронным. Вы должны запросить обновления местоположения, а затем дождитесь, пока он перезвонит вам.

Хуже того, первые несколько обновлений обычно являются мусором, который нужно выбросить.

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

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

Затем вы должны разрешить случай, когда GPS не устанавливается в разумные сроки. (Иногда это может занять несколько минут или просто не получить хорошее чтение.) В этом случае вам нужно обработать его как сбой.

Итак, чтобы обрабатывать все, что вам нужно, чтобы написать ваше locationManager: didUpdateLocation: метод проверки отметки времени и горизонтальной точности, чтобы убедиться, что чтение действительно хорошее.Вам также необходимо убедиться, что вы тайм-аут и сообщите об ошибке, если после разумного ожидания вы не сможете получить приличное местоположение. Один из способов сделать это - запустить таймер «сдачи» при первом запуске обновлений местоположения, и после того, как вы получите хорошее чтение, убейте его. Если таймер срабатывает, прекратите обновление местоположения и сообщите пользователю об ошибке «не удается получить хорошее место». Поймите, что это не редкость, чтобы занять 10 или 15 секунд, чтобы получить достойную точность чтения.

+0

О, нехорошо знать. В этом случае я показываю приливы, поэтому его ближайший сайт прилива, которому слава богу, не нуждается в суперточном чтении, но, несмотря на это, все еще есть вещи, которые я должен учитывать, прежде чем возвращать данные пользователю. Ценить это. – Coughlin

Смежные вопросы