문제 : 다른 프로세서를 많이 사용하는 비 UI 코드가 즉시 호출되면 applicationWillFinishLaunching에서 텍스트가있는 창을 표시하려고 시도하지 않습니다.응용 프로그램 시작 직후 NSWindow가 그려지지 않습니다.
배경 : 시작시 최종 사용자와 상호 작용할 수도 있고 그렇지 않을 수도있는 도우미 응용 프로그램이 있습니다. 사용자 질문을하기 위해 창을 띄워야하는지 여부를 "결정"하는 동안 1 초에서 10 초 사이가 걸릴 수 있습니다 (인터넷을 통해 통신 할 수있는 UI가 아닌 라이브러리 코드에서 시작됩니다).
그래서 나는 그 사용자에게 친절하고 그 라이브러리 코드로 향하기에 앞서 "작업중 인, 잠시 기다려주십시오 ..."라는 창이 나타나기를 바란다. 경과되었습니다.
이 미니 경고 (심지어 NSView, 일부 텍스트 및 버튼이없는 NSWindow)를 그릴 때도 앱 자체가 실행 후 시간이없는 것처럼 보입니다.
라이브러리 코드가 반환 된 후 사용자에게 오류 경고 또는 쿼리 창을 표시하려는 경우 해당 시점에 미니 경고가 예상대로 그립니다. 그러나 미니 알림 (아래 참조)을 닫은 다음 NSAlert를 설정하면 미니 알림에 충분한 시간이 없습니다.
- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
[NSApp activateIgnoringOtherApps:YES];
briefAlertWindowController = [[NSWindowController alloc] initWithWindowNibName:@"BriefAlertWindow"];
[[briefAlertWindowController window] center];
[briefAlertWindowController showWindow:self ];
[[briefAlertWindowController window] orderFront:self ];
[[briefAlertWindowController window] display];
[[briefAlertWindowController window] makeKeyAndOrderFront:nil];
}
및 미니 경고를 기각 : NSWindow 표시하지 NSWindowController도가/파생 된이 미니 경고에 대해 서브 클래스되었는지
가- (void)dismissMiniAlert
{
NSWindow * theWindow = [briefAlertWindowController window];
[theWindow orderOut:nil];
}
참고.
- 사람들이 "스플래시 화면"에 대해 짜증을 내기 때문에 "미니 경고"라는 용어를 사용하고 있습니다. 기능은 비슷하지만 실제로 필자는 어쩔 수없이 오래 작업이 진행 중임을 사용자에게 알리려 고합니다.
분명히 정확합니다. 계속하기 전에 약간의 지연 만 있으면됩니다. runloop을 막지 않는 지연을 도입하는 최선의 방법에 대한 제안? 나는 수면을 시도했지만 분명히 효과가 없습니다. – SMGreenfield
일반적인 방법은'dispatch_after'입니다. 또는'performSelector : afterDelay :'. – matt
하지만 메인 쓰레드에서 프로세서 집약적 인 것들을 얻는 것에 관해서 말한 것은 여전히 의미합니다. 10 초 동안 메인 스레드를 잡고 있으면 피자가 돌아가고 사용자는 아무 것도 할 수 없으며 종료하지 않습니다. – matt