문제

내 문서 기반 응용 프로그램에서는 opendocument 메소드를 재정의했습니다. NSDocumentController의 내 서브 클래스에서 내 자신의 OpenPanel을 표시 할 수 있습니다. 나는 선택한 URL을 opendocumentwithContentSOFURL을 메서드로 전달합니다. 디스플레이 : completionhandler :. 이 코드를 사용하여 다음과 같은 코드를 사용합니다.

[self openDocumentWithContentsOfURL:[chosenFiles objectAtIndex:i] display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {

    if (document == nil)
    {
        NSAlert* alert = [NSAlert alertWithError:error];
        [alert runModal];
    }

}];
.

그래서 nil이 문서의 참조로 되돌아 가면 통과 된 오류를 표시하고 싶습니다. 문제는 오픈 패널에서 "열기"버튼을 누른 후 프로그램이 "멈추는 것"이라는 문제입니다. 그런 다음 Xcode에서 "Stop"버튼을 사용하여 프로그램을 수동으로 중지해야합니다. 비록 회전하는 해변 공이 나타나지 않습니다. "[경고 runmodal]"라인에 주석을 주입하면 프로그램은 더 이상 동결되지 않지만 물론 경고가 표시되지 않습니다.

이제 이상한 일 : 코드는 가끔 입니다. Xcode에서 내 브라우저로 전환하고 다시 프로그램을 다시 실행하면 때로는 완벽하게 작동하고 오류가 표시됩니다. 잠시 후에 다시 일하는 것을 멈 춥니 다. 예측할 수 없지만 대부분의 시간이 작동하지 않습니다.

이 모든 것은 나에게 경쟁 조건처럼 들리으며 소리가 들립니다. 분명히 블록과 관련이있는 것이 있습니까? 그러나 나는 무엇을 잘못합니까?

도움이 되었습니까?

해결책

내 의견을 답변으로 변환 :

메인 스레드에서 runmodel.

[alert performSelectorOnMainThread:@selector(runModal) withObject:nil waitUntilDone:NO]; 
.

AppKit Framework의 일부이기 때문에 RunModel이 주 스레드에서 호출되어야한다고 생각하며 UI 그래픽을 능흡하게 트리거합니다.모든 호출은 AppKit 프레임 워크 또는 그래픽을 조작 해야하는 모든 메소드가 기본 스레드에 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top