Я запуск запроса локализации с использованием 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, он отлично работает, поэтому я думаю, что проблема связана с моей реализацией многопоточности.
Любая идея?
Редактировать
Я не получаю сообщение об ошибке в консоли. Программа просто продолжает работать, но я застрял в этом цикле и ничего больше не происходит после трех первых обновлений местоположения.
Спасибо!
Я не вижу причины, по которой вам нужно использовать GCD для этого? Управляющий местоположением асинхронный все равно ... – mackross
Вы совершенно правы макрок! Это была действительно странная идея дизайна! Спасибо, что вернули мне правильный путь :) – Johanisma