1

У меня есть приложение 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, который принимает блок завершения.

ответ

0

Посмотрите на раздел «обсуждения» Ваш вызов [NSApplication beginSheet: modalForWindow: ...]:

Обсуждения

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

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

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

+0

Хорошо, спасибо, что подтвердили мое предположение. Я, скорее всего, покажу диалог как отдельное окно утилиты. Не идея с точки зрения пользователя, но она должна работать. – Mark