2014-10-22 114 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