Вопрос по cocoa – Главная тема Runloop блокируется при открытии nsmenu

3

У меня есть приложение, для которого элемент пользовательского интерфейса включает в себяNSStatusItem и меню. Внутри моего приложения я используюNSTask асинхронно выполнить некоторую операцию, и я использую вывод, полученный с использованиемNSFileHandleReadCompletionNotification обновить меню. Но теперь, когда я нажимаю и открываю меню, основной цикл запуска переходит вNSEventTrackingRunLoopMode и отправка уведомления не удалась. Таким образом, в основном при открытом меню никакие операции с основным потоком не выполняются. Теперь я нашел похожую проблему наэтот сообщение, но принятое решение там, похоже, не помогает. Я понимаю что дляNSNotificationCenter ,NSRunloopDefaultMode не должен быть заблокирован. Есть ли способ изменить это поведение? Может кто-нибудь, пожалуйста, помогите ???

Ваш Ответ

1   ответ
2

Я предполагаю, что у вас естьNSFileHandle это представляетNSTask& APOS; sstdoutи вы попросили его-readInBackgroundAndNotify.

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

Вместо этого вы хотите использовать-readInBackgroundAndNotifyForModes: метод, в который вы бы передали массив, содержащий какNSDefaultRunLoopMode а такжеNSEventTrackingRunLoopMode, Это указывало бы на цикл запуска, что вы хотите получать уведомления о любых доступных данных, когда цикл запуска находится либо в режиме по умолчанию, либо в режиме отслеживания событий.

Error: User Rate Limit Exceeded ping localhost

Похожие вопросы