Изменить приоритет операций в NSOperationQueue iOS - PullRequest
0 голосов
/ 08 мая 2018

Я добавляю операции в NSOperationQueue в асинхронном режиме.У меня есть требование, как мне нужно изменить приоритет операций, как у меня есть операции A, B, C добавляются в очередь, и мне нужно сначала выполнить операцию C.Если я получаю какую-то ошибку при выполнении, я должен выполнить эту операцию в очереди с высоким приоритетом.Я гуглил об этом, мы не можем так поступить.Используя GCD, мы можем сделать это с помощью уведомлений и ожидания.У меня есть запрос, если я добавил операцию A в асинхронном режиме, а B и C добавлены в группу уведомлений.При этом операция A будет выполняться в первую очередь после того, как будут выполнены B и C.Если я получаю ошибку при выполнении операции A, то я добавляю ее в группу до тех пор, пока операция не будет успешной.Вот в этом процессе, если после добавления Операции А какая из них будет сначала выполняться Операцией А или Операцией B / C.В моем требовании операция A должна выполняться в первую очередь.Я новичок в блоках, пожалуйста, предложите мне, если мы можем реализовать через очереди или GCD.Пожалуйста, предоставьте некоторый связанный код.Мне нужно выполнить одну задачу за раз. Также я использую maxConcurrentOperationCount = 1.

1 Ответ

0 голосов
/ 08 мая 2018

Ни очереди NSOperationQueue, ни GCD не должны быть очередями приоритета . В основном это очереди FIFO с дополнительным умом. Также они сияют лучше, если вам нужно несколько одновременных операций.

В вашем сценарии (maxConcurrentOperationCount = 1 с настраиваемым планированием) просто старый NSThread вполне подойдет.

Сначала вам нужно реализовать приоритетную очередь вещей или повторно использовать библиотеку, которая делает это (один пример - atljeremy PriorityQueue , но вам, вероятно, придется адаптировать ее для поддержки изменения приоритетов после элемента был добавлен.

Затем просто запустите цикл (внутри NSThread), который берет задачу из очереди и запускает ее:

while (!isStopped) {
    NSOperation *task = [queue poll];
    [task main];
}

Вы можете повторно использовать NSOperation или создать свой собственный тип задачи, это ваше дело. Вы также можете использовать блоки dispatch_block_t в качестве задач.

...