Я где-то читал, что NSTask не является потокобезопасным …
Это не то, что говорит эта страница.В нем говорится, что вы получите уведомление о завершении процесса в том же потоке, из которого вы его запустили, что говорит о том, что NSTask знает о потоках и пытается делать правильные вещи.
Проблема одного из редакторовэта страница была связана с тем, что они начали свой процесс с потока, а затем позволили потоку умереть.Это вызвало сбой, потому что инфраструктура больше не могла доставлять уведомление о завершении процесса нужному потоку.
Сводка по безопасности потока (закладка, что) говорит нечто подобное, перечисляя NSTask всписок классов, о которых говорится:
В большинстве случаев вы можете использовать эти классы из любого потока, если вы используете их только из одного потока за раз.Обратитесь к документации класса для получения дополнительной информации.
Документация NSTask не говорит ничего о потоках, поэтому кажется, что NSTask является одним из «большинства случаев»: вы можете использовать задачу изнить вы создали его.Не используйте ту же задачу в другом потоке, и (как отмечено выше) убедитесь, что поток длится, по крайней мере, столько же времени, сколько процесс задачи.
Однако я отмечу, что в большинстве случаевнет необходимости запускать задачу в отдельном потоке.Отдельные процессы, как правило, выполняются на других процессорах, как и другие потоки в вашем процессе, и цикл выполнения отлично справляется с мультиплексированием множества небольших событий и поддержанием отзывчивости пользовательского интерфейса.Вы можете использовать NSFileHandle readInBackgroundAndNotify
метод , если вам нужно прочитать выходные данные из задачи.Возможно, вы сможете полностью обрезать свои рабочие потоки.
Альтернатива, как предложил Eimantas, заключается в использовании NSOperation: иметь операцию, которая просто запускает определенную задачу и ожидает завершения этой задачи (возможно, синхронное чтениевыход из него).Операция завершается после завершения задачи.