应用程序因CLLocationManager挂起(mainThread被阻止?)

时间:2011-11-06 13:54:15

标签: iphone objective-c ios ipad cllocationmanager

我制作了一个天气应用程序,目前需要使用您的位置才能工作。我正忙着尝试解决这种依赖问题,但我仍然需要知道用户是否允许它,首先启动,创建一个当前位置管理对象来使用。

这个想法是它加载了前几个东西,然后在必要时请求许可,然后继续。它起初工作,我不知道我改变了什么来打破它,但我希望你们中的一些人能够看到错误。我一直盯着自己看了几个小时,所以一些新观点将不胜感激:)

对于第二次阅读此内容的人:是的,我重新写了这个问题,因为问题似乎在其他地方而不是我的想法。

我的应用永远不会超过这段代码:

dispatch_sync(dispatch_get_main_queue(), ^{
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
});

这是我在didFinishLaunching方法中发生的第一件事,我找不到阻止主线程的任何东西。早些时候,我有一个类似的问题,我设法从locationmanager获得授权,但后来应用程序停止在主队列上的调度(初始化我的界面)。那为什么会被封锁?

1 个答案:

答案 0 :(得分:1)

好吧,您的主队列当前正在执行application:didFinishLaunchingWithOptions:。然后你来找它等待dispatch_sync),直到它执行了位置管理器块 - 在主队列不再忙的情况下它才能开始执行。所以你有一个经典的死锁情况。

为什么你在这里使用dispatch_sync块?