2012-10-02 3 views
1

블록 (완료 블록)에서 실행중인 간단한 코드가 있습니다. 완료 블록에서 블록의 프로세스가 FALSE를 반환하면 UIAlertView를 표시하려고합니다. 모범 사례로 UIAlertView를 표시하기 위해 dispatch_get_main_queue를 사용하기 때문에 배경 스레드에서 UI 메서드를 호출하지 않아야합니다. UIAlert보기의 취소 버튼을 누르면 wait_fences : reply 수신에 실패했습니다 : 10004003 오류 메시지가 나타나는 것을 제외하면이 작업은 정상적으로 작동합니다.wait_fences : 응답을받지 못했습니다 : 10004003 오류

코드는 다음과 같습니다. 이 작업을 어떻게 다른 방법으로 할 수 있을지 잘 모르겠다. 코드가 정확하고 올바르게 작동해야하지만 분명히 문제가있다. 다른 눈으로도 문제를 찾을 수 있기를 바랬습니다.

__block bool theResult; 
    [self.mbProgressHUD showAnimated:YES whileExecutingBlock:^{ 
     theResult = [someClass someMethodThatReturnsTRUEorFALSE]; 
    } completionBlock:^{ 
     [self.mbProgressHUD removeFromSuperview]; 
     if (theResult) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      UIAlertView *theAlert.... 
      [theAlert show]; 
     }); 
     }; 
    }]; 

UIAlert에서 확인 버튼을 선택한 경우를 제외하면 모든 것이 정상적으로 작동하는 것 같습니다. wait_fences 수신 : 회신을받지 못했습니다 : 100040003 오류 메시지.

도움을 주시면 감사하겠습니다.

답변

0

removeFromSuperview은 UI를 건드린 것으로 간주되는보기 계층 구조에 직접적인 영향을줍니다. 백그라운드 스레드에서 UI를 건드릴 수 없습니다. [self.mbProgressHUD removeFromSuperview];을 기본 대기열에 넣어야합니다.

+0

나는 또한 그것을 시도했다. completionBlock의 모든 것을 감싸는 dispatch_asynch (dispatch_get_mainqueue(),^{}) 블록으로 처리했습니다. 같은 문제. 방금 다시 시도했는데 동일한 결과가 나타납니다. – StinkyDuck

+0

이 전체 스 니펫은 백그라운드 스레드에 있습니까? 'showAnimated : ... '도 주 스레드에 있어야합니다. –

관련 문제