2011-11-06 86 views
1

我制作了一个当前需要使用您的位置才能工作的天气应用程序。我忙于试图获取该依赖项,但我仍需要在第一次启动时知道用户是否允许它,以创建当前位置管理对象。由于CLLocationManager导致应用程序挂起(mainThread被阻止?)

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

对于第二次阅读这个问题的人:是的,我重新写了这个问题,因为问题似乎比我想象的还要别处。

我的应用程序永远不会越过这一段代码:

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

这是发生在我的didFinishLaunching方法的第一件事情,我无法找到任何会被阻塞mainthread。早些时候,我遇到了类似的问题,我设法从位置管理器获得授权,但稍后应用程序停止在主队列上的一个分派中(以初始化我的接口)。那为什么它被封锁?

+0

这很奇怪,但我也有同样的问题,甚至乳清我从后台线程调用完全相同的代码。 –

回答

1

那么,你的主队列正在执行application:didFinishLaunchingWithOptions:。然后,你就跟着去问它等待dispatch_sync),直到它执行了位置管理器块 - 它不能开始执行直到主队列不再忙。所以你有一个典型的死锁情况。

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

+0

我在那里一直有一个异步,但改变它同步,看看主线程是否确实锁定。我会尝试将整块代码移到生命周期的后期,并希望它能在那里工作;) –

相关问题