【问题标题】:App hanging due to CLLocationManager (mainThread blocked?)由于 CLLocationManager 导致应用程序挂起(mainThread 被阻塞?)
【发布时间】:2011-11-06 13:54:15
【问题描述】:

我制作了一个天气应用程序,它目前需要使用您的位置才能工作。我正忙着试图消除这种依赖关系,但我仍然需要在第一次开始时知道用户是否允许它,以创建一个当前位置托管对象来使用。

这个想法是它加载前几件事,然后在必要时请求许可,然后继续。一开始它有效,我不确定我做了什么改变来打破它,但我希望你们中的一些人能看到哪里出了问题。几个小时以来,我一直在盯着自己瞎看,所以希望能有一些新的看法:)

对于第二次阅读本文的人:是的,我重新写了这个问题,因为问题似乎出在我想象的其他地方。

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

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

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

【问题讨论】:

  • 这很奇怪,但我有同样的问题,即使我从后台线程调用完全相同的代码。

标签: iphone objective-c ios ipad cllocationmanager


【解决方案1】:

嗯,您的主队列当前正在执行application:didFinishLaunchingWithOptions:。然后你过来要求它等待 (dispatch_sync),直到它执行完位置管理器块——直到主队列不再忙,它才能开始执行。所以你遇到了典型的死锁情况。

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

【讨论】:

  • 我在那里一直有一个异步,但将其更改为同步以查看主线程是否确实锁定。我将尝试将整个代码块移动到生命周期的后期,并希望它能在那里工作;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多