Ни очереди NSOperationQueue, ни GCD не должны быть очередями приоритета . В основном это очереди FIFO с дополнительным умом. Также они сияют лучше, если вам нужно несколько одновременных операций.
В вашем сценарии (maxConcurrentOperationCount = 1 с настраиваемым планированием) просто старый NSThread вполне подойдет.
Сначала вам нужно реализовать приоритетную очередь вещей или повторно использовать библиотеку, которая делает это (один пример - atljeremy PriorityQueue , но вам, вероятно, придется адаптировать ее для поддержки изменения приоритетов после элемента был добавлен.
Затем просто запустите цикл (внутри NSThread), который берет задачу из очереди и запускает ее:
while (!isStopped) {
NSOperation *task = [queue poll];
[task main];
}
Вы можете повторно использовать NSOperation или создать свой собственный тип задачи, это ваше дело. Вы также можете использовать блоки dispatch_block_t
в качестве задач.