2014-10-22 4 views
0

내 응용 프로그램이 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION과 붙어 있습니다. 내 응용 프로그램에서 비동기 인 C 함수를 호출했습니다. 실행 중에 대기중인 메시지를 표시합니다.
이 함수가 종료되면 대리자를 호출하여 대기중인 메시지를 닫고 AlertView를 동시에 표시합니다. 응용 프로그램이 CPU 사용량이 최대 100 %까지 고정되었습니다.

은 내가 alertview

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

응용 프로그램이 붙어있어 때 디버거 엑스 코드의 스크린 샷입니다에게 보여 GCD를 사용합니다. 내 응용 프로그램의 CPU 사용량이 최대 100 %라는 것을 알 수 있습니다. 아마도 응용 프로그램이 시스템에서 일시 중단 된 이유 일 수 있습니다. dispatch_async(dispatch_get_main_queue(), ^{...

대신에

enter image description here

+0

나는 백그라운드에서 실행하려는 것을 정확히 따르지 않고 있습니다. 백그라운드 대기열을 생성하고 즉시 기본 대기열 블록으로 채우고 있습니다. 첫 번째 줄과 마지막 줄을 삭제하고 동일한 효과를 얻을 수 있습니다. 또한'UIAlertView'는 더 이상 사용되지 않으며'UIAlertController'를 사용하여 모든 종류의 블록 처리를 얻을 수 있습니다. – iluvcapra

+0

문제가 해결되었습니다. 다른 코드 블록이 원인입니다. 추신 : UIAlertView는 iOS 8.0에서 폐기되었습니다. –

답변

-1

사용 dispatch_sync() 당신은 백그라운드 스레드에서 UI를 업데이트 할 수 없습니다.

+1

하지만 dispatch_async에서는 주 큐에서 실행할 코드를 추가합니다. 나는 UI를 업데이트하는 것이 옳다고 생각한다. –

+1

메인 큐에서 비동기를 실행해서는 안됩니다. 가장 좋은 방법은 백그라운드 대기열을 만들어 dispatch_async()와 함께 사용하고 dispatch_sync() 호출에 dispatch_get_main_queue()를 사용하는 것입니다. –