CLLocationmanager从后台线程更新

时间:2011-01-08 00:40:31

标签: multithreading ios cllocationmanager grand-central-dispatch

我正在使用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);
}

它在我的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的{​​{1}}属性已初始化并询问LocationManagerController

最后,当位置更新发生时的方法:

startUpdatingLocation

我的问题是,locationManager只发送3个位置更新,然后停止发送更新,即使我没有要求它停止。所以基本上,我永远不会离开(![locationManagerController getterDone])循环。

顺便说一下,在尝试使用GCD实现它之前,它运行正常,所以我猜这个问题与我的多线程实现有关。

有什么想法吗?

修改

我在控制台中没有收到任何错误。该程序只是继续运行,但我陷入了循环,并且在3个第一个位置更新后没有其他任何事情发生。

谢谢!

2 个答案:

答案 0 :(得分:3)

来自CLLocationManager类引用:

  

您的位置管理器对象的配置必须始终在a上进行   具有活动运行循环的线程,例如应用程序的主循环   线程。

答案 1 :(得分:0)

猜测。如果您坐在办公桌前并使用模拟器进行测试,那么准确性可能无法达到您想要的效果

if (newLocation.horizontalAccuracy <= manager.desiredAccuracy) 

所以你可能会陷入困境。在办公桌前尝试更高的准确性。还要考虑精确度是否永远不会超出你想要的,因为它可能是gps接收不好。

请告诉我,如果这有用,或者如果我不合时宜: - )

- Fasttouch