Технически, NSRunLoop
зацикливается внутри (это происходит до даты). Это дает вам периодическую возможность выйти из потока - если вы используете run
вместо runUntilDate:
, тогда NSRunLoop
будет внутренне зацикливаться (вам не нужно будет оборачивать его в цикле while, но вы никогда не сможете остановиться это тоже). Это нормальное поведение для основного потока, а не рабочих потоков, которые обычно имеют условия выхода, которые требуют периодической проверки.
runLoop
никогда не изменит значение moreWorkToDo
или exitNow
(вы несете ответственность за это, когда работа потока завершена или пользователь вышел из вашего приложения), но именно так вы решите, хотите ли вы поток для завершения.
В зависимости от того, как вы хотите, чтобы ваш поток работал, вы можете заменить эти флаги на [NSApp isRunning]
и [tasksRemainingForThisThreadToProcess count] != 0
или аналогичные.
(Предупреждение о состоянии гонки: если вы завершаете поток, когда все оставшиеся задачи обрабатываются, будьте осторожны, чтобы никогда не отправлять в него другую задачу, когда tasksRemainingForThisThreadToProcess
пуст, поскольку это указывает на то, что поток завершит работу).