I’ve имел подобные проблемы при попытке справиться NSRunLoops
. обсуждение для runMode:beforeDate:
на странице ссылок класса говорит:
, Если никакие входные источники или таймеры не присоединены к циклу выполнения, этот метод сразу выходит; иначе это возвращается, или после первый входной источник обрабатывается или после limitDate, достигнут. Вручную удаление всех известных входных источников и таймеров от цикла выполнения не является гарантией, что цикл выполнения выйдет. Mac OS X может установить и удалить дополнительные входные источники по мере необходимости для обработки запросов, предназначенных для потока receiver’s. Те источники могли поэтому препятствовать тому, чтобы цикл выполнения вышел.
Мое лучшее предположение - то, что входной источник присоединен к Вашему NSRunLoop
, возможно, самим OS X, и что runMode:beforeDate:
блокируется до того входного источника или имеет некоторый вход, обработанный, или удален. В Вашем случае это брало" несколько секунд и до 10 секунд " для этого для случая, в котором точка runMode:beforeDate:
возвратится с булевской переменной, эти while()
работал бы снова, это обнаружит, что shouldKeepRunning
был установлен на NO
, и цикл завершится.
С Вашим улучшением эти runMode:beforeDate:
возвратится в течение 0,1 секунд, независимо от того, присоединило ли оно входные источники или обработало какой-либо вход. Это - образованное предположение (я не эксперт по внутренностям цикла выполнения), но думайте, что Ваше улучшение является правильным способом обработать ситуацию.
Просто вы можете использовать следующий сценарий SQL для удаления индекса в MySQL:
alter table fuinfo drop index email;