Пользовательский модальный диалог и фоновые операции - PullRequest
1 голос
/ 16 февраля 2012

У меня есть приложение Cocoa с настраиваемой многоэтапной настройкой учетной записи, которую я реализовал в виде настраиваемого модального диалога с набором представлений.

Проблема в том, что фоновые операции (выборка URL) кажутсязастрять.Я предполагаю, что это потому, что приложение находится в модальном режиме.

Вот код для запуска модального диалога:

[NSApp beginSheet:accountSetupController.window modalForWindow:self.window 
            modalDelegate:nil didEndSelector:NULL contextInfo:NULL];

[accountSetupController beginAccountSetup]; // this later launches the background operation
[NSApp runModalForWindow:accountSetupController.window];

NSApp endSheet:accountSetupController.window];

Прежде всего, верно ли мое предположение?Есть ли способ выполнить фоновую операцию, даже если приложение работает модально?

Фактическая фоновая операция не находится под моим контролем.Это внешний API, который принимает блок завершения.

1 Ответ

0 голосов
/ 16 февраля 2012

Взгляните на раздел "обсуждение" вашего звонка на [NSApplication beginSheet: modalForWindow: ...]:

Обсуждение

Этот метод запускает модальный цикл событий для указанного листа. синхронно. Он отображает лист, делает его ключом, запускает прогон цикл, и обрабатывает события для него. Пока приложение запущено цикл, он не реагирует ни на какие другие события (включая мышь, события клавиатуры или закрытия окна), если они не связаны с простынь. Он также не выполняет никаких задач (таких как таймеры запуска), которые не связаны с модальным циклом выполнения. Другими словами, это метод потребляет только достаточно времени процессора для обработки событий и отправки их методы действия, связанные с модальным окном.

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

Лучшее решение - не использовать модальные диалоги, если вам нужно асинхронно общаться с сервером. Если вам необходимо использовать модальные диалоги, попробуйте установить связь между модальными листами (т. Е. Когда пользователь нажимает кнопку «отправить», завершите лист и поговорите с сервером, а затем вызовите следующий лист для следующего шага).

...