2016-12-01 10 views
0

Проблема: попытка отобразить окно с текстом из приложения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 были получены/подклассы для этого мини-оповещения.

  • Я использую термин «мини-предупреждение», потому что я заметил, что люди раздражают концепцию «заставки». Хотя функциональность аналогична - я просто пытаюсь сообщить пользователю, что происходит неизбежно длительная операция.

ответ

2

Это звучит как проблема с резьбой. Всплывающее окно не может нарисовать себя на основном потоке, потому что основной поток занят, делая интенсивную работу с процессором. Правильно, ваш процессор-интенсивный материал должен происходить в фоновом потоке. Если вы не можете этого сделать, вам нужно хотя бы выйти из основного потока достаточно долго, чтобы дать runloop шанс нарисовать ваше окно. Просто введите задержку.

+0

Вы, безусловно, правы, мне просто нужно сделать небольшую задержку, прежде чем продолжить. Любое предложение о том, как лучше ввести задержку, которая не будет блокировать runloop? Я пробовал спать (n), но это явно не работает. – SMGreenfield

+1

Обычным способом является 'dispatch_after'. Или 'performSelector: afterDelay:'. – matt

+0

Но, пожалуйста, обратите внимание, что то, что я сказал о том, чтобы получить материал, насыщенный процессором, из основного потока, все еще стоит. Удерживая основную нить в течение 10 секунд, вращение пиццы смерти и пользователь ничего не сможет сделать - даже не уйти. – matt