1

Я запуск запроса локализации с использованием Grand Central Dispatch:обновление менеджер CLLocation из фонового потока

- (void) findGroceriesNearMe { 
    dispatch_queue_t downloadQueue = dispatch_queue_create("Groceries downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 
     CLLocationCoordinate2D userLocation = [LocationManagerController findMeWithCaller:self]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self userSuccessFullyFound:userLocation]; 
     }); 
    }); 
    dispatch_release(downloadQueue); 
} 

Он вызывает статический метод в моем Singleton класса LocationManager контроллере:

+ (CLLocationCoordinate2D) findMeWithCaller: (UIViewController *) viewController { 

    LocationManagerController *locationManagerController = [LocationManagerController locationManagerController]; 
    [locationManagerController startUpdates]; 

    while(![locationManagerController getterDone]){ 
     //mystique pour nous-- a approfondir 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 

В методе startUpdates, CLLocationManager, свойство LocationManagerController, инициализируется и запрашивается startUpdatingLocation.

Наконец, метод, когда обновления местоположения происходит:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    locationDenied = NO; 
    NSLog(@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude); 

    NSDate* eventDate = newLocation.timestamp; 
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; 
    // On vérifie que la newLocation est récente 

    if (abs(howRecent) > 10.0) { 
     return; 
    } 

    // Test if it's not an invalid measurement 

    if (newLocation.horizontalAccuracy < 0) return; 

    // Test the measurement to see if it meets the desired accuracy 

    if (newLocation.horizontalAccuracy <= manager.desiredAccuracy) 

    { 
     latitude = newLocation.coordinate.latitude; 
     longitude = newLocation.coordinate.longitude; 
     locationDefined = YES; 
     [self setterDone:YES]; 
    } 
} 

Моя проблема заключается в том, что locationManager отправить только 3 геоданных, а затем прекращает посылать обновления, даже если я не просил его остановиться. Так что в принципе, я никогда не выхожу из цикла while (! [LocationManagerController getterDone]).

Кстати, прежде чем пытаться реализовать это с помощью GCD, он отлично работает, поэтому я думаю, что проблема связана с моей реализацией многопоточности.

Любая идея?

Редактировать

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

Спасибо!

+0

Я не вижу причины, по которой вам нужно использовать GCD для этого? Управляющий местоположением асинхронный все равно ... – mackross

+0

Вы совершенно правы макрок! Это была действительно странная идея дизайна! Спасибо, что вернули мне правильный путь :) – Johanisma

ответ

0

Догадка. Если вы сидите за столом и тестирование с помощью тренажера точность не может стать лучше, что вы хотите

if (newLocation.horizontalAccuracy <= manager.desiredAccuracy) 

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

Позвольте мне знать, если это помогает или если я был путь от марки :-)

- FastTouch

+0

Я действительно тестировал это на устройстве. Я не думаю, что проблема возникает из-за того, что менеджер местоположений не прекращает отправлять обновления ... комментарий mackross очень важен: я не должен использовать GCD для этого типа! – Johanisma

3

Из CLLocationManager ссылки класса:

конфигурации вашего объекта менеджер местоположения должен всегда встречаются в потоке с активным циклом запуска, например, с потоком вашего приложения.

+0

И как мне настроить один из них? –