2014-10-22 117 views
0

我的应用程序坚持与CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION。 在我的应用程序中,我调用了一个异步的C函数。我在执行过程中显示等待的消息。
当此功能终止时,它会调用委托来关闭该等待消息并同时显示AlertView。应用程序被CPU占用率高达100%

我使用GCD展现alertview

dispatch_async(dispatch_queue_create("com.myapp.service.waitingmessage", nil), ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
      UIAlertView *anAlert = ... 
      [anAlert show]; 
      }); 
     }); 

这里是调试器的XCode的截屏应用时卡住了。 我还看到我的应用程序的CPU使用率高达100%,也许这就是为什么应用程序被系统暂停的原因。

enter image description here

+0

我没有完全遵循你想要在后台运行的内容。你正在创建一个后台队列,并立即填充一个主循环块。您可以删除第一行和最后一行并获得相同的效果。另外请注意'UIAlertView'已被弃用,您将使用'UIAlertController'获得任何类型的块处理。 – iluvcapra 2014-11-04 19:38:51

+0

我解决了这个问题。这是由另一个代码块引起的。 PS:UIAlertView只从iOS 8.0 – 2014-11-05 09:16:18

回答

-1

使用dispatch_sync()代替dispatch_async(dispatch_get_main_queue(), ^{...

您无法更新从后台线程的用户界面。

+1

过时。但在我的dispatch_async中,我添加了要在主队列中执行的代码。我认为这样更新UI是正确的。 – 2014-10-22 12:19:14

+1

你不应该在主队列上执行你的异步。最好的做法是创建一个后台队列,将其与dispatch_async()一起使用,并对dispatch_sync()调用使用dispatch_get_main_queue()。 – 2014-10-22 12:26:49