Я пишу однопоточное приложение Какао и пытаюсь использовать методологию утилиты NSNotificationCenter
(так как кажется, как это делается в какао) для выполнения неблокирующего ввода-вывода.
Кажется, все работает нормально , за исключением , когда дескриптор файла закрыт. Это в конечном счете уведомляет меня, но это берет навсегда. Кто-нибудь может объяснить, почему это будет?
Точнее говоря, я пишу заставку, которая разветвляет процесс и считывает его стандартный вывод. Поведение также меняется в зависимости от контекста. Когда он запускается в окне предварительного просмотра в Системных настройках, он уведомляет о закрытии быстрее, чем при запуске в полноэкранном режиме при нажатии кнопки тестирования.
Edit: После небольшой мысли, я считаю, что проблема в том, что последняя запись и закрытие происходят примерно в одно и то же время. Последнее чтение происходит после закрытия NSFileHandle
и возвращает данные (т.е. не в EOF). Я заканчиваю, ожидая его, но так как дескриптор файла неактивен, основной цикл останется заблокированным, так как нечего сигнализировать о его выполнении. Причина, по которой работает режим предварительного просмотра, заключается в том, что всякий раз, когда я щелкаю по чему-либо в окне «Системные настройки», я заставляю основной цикл выполняться, и он проверяет состояние ожидающего NSFileHandle
и видит, что он закрыт.
Теперь я думаю, что знаю, что происходит, но я все еще не знаю, как выяснить, что NSFileHandle
закрыт без блокировки!
После еще нескольких испытаний эта проблема, по-видимому, не относится к моменту запуска Заставки.