Обновления менеджера CLLocation из фонового потока - PullRequest
1 голос
/ 08 января 2011

Я запускаю запрос на локализацию, используя Grand Central Dispatch:

- (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);
}

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

+ (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, все работало нормально, поэтому я думаю, что проблема связана с моей реализацией многопоточности.

Есть идеи?

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

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

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

Конфигурация объекта вашего менеджера местоположения всегда должна происходить на поток с активным циклом выполнения, таким как основной нить.

0 голосов
/ 09 января 2011

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

if (newLocation.horizontalAccuracy <= manager.desiredAccuracy) 

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

Дайте мне знать, если это помогает, или если я был далеко от цели: -)

- Fasttouch

...