Пожалуйста, не используйте модальное окно приложения, если это не является абсолютно необходимым.Используйте лист, если это возможно.Однако, если вам нужно использовать модальное диалоговое окно, вы можете запустить основной цикл выполнения, предоставив ему некоторое время, пока модальное диалоговое окно открыто:
NSModalSession session = [NSApp beginModalSessionForWindow:[self window]];
int result = NSRunContinuesResponse;
while (result == NSRunContinuesResponse)
{
//run the modal session
//once the modal window finishes, it will return a different result and break out of the loop
result = [NSApp runModalSession:session];
//this gives the main run loop some time so your other code processes
[[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];
//do some other non-intensive task if necessary
}
[NSApp endModalSession:session];
Это очень полезно, если у вас есть представления, требующиеосновной цикл выполнения для работы (WebView
приходит на ум).
Однако следует понимать, что модальный сеанс - это просто так, и любой код после вызова beginModalSessionForWindow:
не будетвыполняется до тех пор, пока модальное окно не закроется и модальный сеанс не закончится.Это одна из очень веских причин не использовать модальные диалоги.
Обратите внимание, что вы не должны выполнять какую-либо значительную работу в цикле while
в приведенном выше коде, потому что тогда вы заблокируете свой модальный сеанс, а такжецикл основного запуска, который превратит ваше приложение в город для пляжного мяча.
Если вы хотите сделать что-то существенное в фоновом режиме, вы должны использовать некоторую форму параллелизма, такую как использование NSOperation
, фоновую очередь GCD илипросто простой фоновый поток.