Какао: как запустить модальное окно при выполнении фоновой задачи? - PullRequest
2 голосов
/ 30 августа 2011

Я пытался позвонить

modalSession=[NSApp beginModalSessionForWindow:conversionWindow];
[NSApp runModalForWindow:conversionWindow];

для того, чтобы получить модальное окно преобразования, которое не позволяет пользователю взаимодействовать с остальной частью приложения, но это также, кажется, блокирует выполнение кода. Я имею в виду, что код, который идет после кода, показанного выше, вообще не выполняется. Как я могу это исправить? Я уверен, что это возможно, потому что многие приложения показывают некоторый прогресс при выполнении какой-то большой задачи, такой как конвертация видео и т. Д. *

Ответы [ 2 ]

7 голосов
/ 31 августа 2011

Пожалуйста, не используйте модальное окно приложения, если это не является абсолютно необходимым.Используйте лист, если это возможно.Однако, если вам нужно использовать модальное диалоговое окно, вы можете запустить основной цикл выполнения, предоставив ему некоторое время, пока модальное диалоговое окно открыто:

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 илипросто простой фоновый поток.

3 голосов
/ 30 августа 2011

Вам нужно запустить фоновую «задачу» в другом потоке, если вы хотите, чтобы она запускалась, пока модальное окно открыто.Но в большинстве случаев лучшее решение - не использовать модальное окно.

...