Проблема: попытка отобразить окно с текстом из приложенияWillFinishLaunching НЕ будет рисоваться, если сразу будет вызван другой процессорный код, отличный от него.NSWindow не будет рисоваться сразу после запуска приложения
Справочная информация: У меня есть вспомогательное приложение, которое при запуске может или не может взаимодействовать с конечным пользователем. Хотя «решать», если ему нужно поставить окно для запроса пользовательских вопросов, может быть где-то от 1 секунды до 10 секунд, которые истекают (после запуска он отключен в коде, не совместимом с UI, через Интернет).
Таким образом, я хотел быть добрым к пользователю и установить окно «мини-предупреждение» * с «рабочим, пожалуйста, подождите ...», перед заголовком в этот код библиотеки, который я увольню после этой обработки истек.
Кажется, что у самого приложения нет времени после запуска, чтобы даже нарисовать мини-предупреждение (это просто NSWindow, с NSView, некоторый текст и никакие кнопки).
Если после того, как код библиотеки вернется и вы хотите установить предупреждение об ошибке или окно запроса для пользователя, то в этот момент мини-предупреждение рисуется так, как ожидалось. Однако, если я закрываю мини-предупреждение (см. Ниже), а затем выставляю 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];
}
и отклоняя мини-уведомление:
- (void)dismissMiniAlert
{
NSWindow * theWindow = [briefAlertWindowController window];
[theWindow orderOut:nil];
}
ВНИМАНИЕ, что ни NSWindow не NSWindowController были получены/подклассы для этого мини-оповещения.
- Я использую термин «мини-предупреждение», потому что я заметил, что люди раздражают концепцию «заставки». Хотя функциональность аналогична - я просто пытаюсь сообщить пользователю, что происходит неизбежно длительная операция.
Вы, безусловно, правы, мне просто нужно сделать небольшую задержку, прежде чем продолжить. Любое предложение о том, как лучше ввести задержку, которая не будет блокировать runloop? Я пробовал спать (n), но это явно не работает. – SMGreenfield
Обычным способом является 'dispatch_after'. Или 'performSelector: afterDelay:'. – matt
Но, пожалуйста, обратите внимание, что то, что я сказал о том, чтобы получить материал, насыщенный процессором, из основного потока, все еще стоит. Удерживая основную нить в течение 10 секунд, вращение пиццы смерти и пользователь ничего не сможет сделать - даже не уйти. – matt