Каждый поток имеет цикл выполнения.
Каждый цикл выполнения имеет список вещей, которые необходимо сделать. Эти вещи называются «запланированными» в цикле выполнения, хотя не все они запланированы на определенную дату и время:
- Таймеры.
- Источники не являются. Обычно они ждут, чтобы что-то постучало в порт ядра Mach или в дескриптор файла.
Когда цикл выполнения работает, он обычно не работает, то есть поток спит, не потребляя циклов ЦП. (Если вы попробуете его, вы обнаружите, что процесс застрял в mach_msg_trap
. Это системный вызов «ожидайте чего-то».) Ядро пробуждает поток (который, таким образом, возвращается из mach_msg_trap
) когда что-то происходит, о чем нужно позаботиться в цикле выполнения потока.
Способ сделать именно то, что вы описали, - реализовать источник цикла выполнения . Вы планируете источник в цикле выполнения вторичного потока, реализуете его, выполняя работу, и сообщаете об этом из первичного потока, когда есть работа, которую нужно сделать.
Однако NSOperation почти наверняка является лучшим решением, поскольку оно разработано для случая, который вы описали: Дискретные единицы работы, которые необходимо выполнять последовательно, до N (которое вы выбираете и составляет не менее 1) за один раз.
Обратите внимание, что NSOperationQueue повторно использует потоки, поэтому он не обязательно создает новый поток для каждой операции. На самом деле, не делать это - часть дела: он лениво создает потоки и использует все, что у него уже есть, но ничего не делает.