Мне нужно приостановить выполнение NSOperation, которое было вставлено в NSOperationQueue. Сейчас я отменяю все операции и перезапускаю их. Но это привело бы к некоторому дублированию выполняемого процесса. Я пробовал с флагом setSuspended NSOperationQueue. Но это не приостанавливает работу. Есть ли выход?
Как я могу приостановить NSOperation в NSOperationQueue?
Ответы (3)
см. это: Ссылка
А здесь из документы Apple:
Приостановка и возобновление очередей Если вы хотите временно остановить выполнение операций, вы можете приостановить соответствующую очередь операций с помощью метода setSuspended :.
Приостановка очереди не приводит к приостановке уже выполняемых операций в середине их задач. Он просто предотвращает планирование выполнения новых операций. Вы можете приостановить очередь в ответ на запрос пользователя о приостановке любой текущей работы, поскольку ожидается, что пользователь в конечном итоге захочет возобновить эту работу.
Я не пробовал, но, наверное, начну с этого:
- добавьте флаг
isPaused
в свойNSOperation
подкласс - реализовать метод копирования / перемещения для данных операции
- если приостановлено,
setCancelled:
(обратите внимание на это изменение в-main
) - создать новую операцию, перемещающую состояние из приостановленной операции в новую операцию
- отрегулируйте приоритет, чтобы изменить порядок операций в очереди, если хотите
- добавить клон в очередь
- возврат из
-main
, если в-main
обратите внимание, что это просто приостановит его. если вы действительно хотите приостановить и явно возобновить, вы должны вручную «новую операцию», когда захотите возобновить.
теперь, если вы наблюдаете или имеете особые доработки, у вас будут еще несколько проблем. для простых случаев этот подход работает нормально.
В Swift 5 вы можете использовать свойство isSuspended для приостановки и возобновления OperationQueue, вы можете увидеть пример для большего понимания: -
let operationQueue = OperationQueue()
let op1 = BlockOperation {
print("done")
}
let op2 = BlockOperation {
print("op2")
}
let op3 = BlockOperation {
print("op3")
}
op1.addDependency(op2)
operationQueue.addOperations([op1, op2, op3], waitUntilFinished: false)
operationQueue.isSuspended = true
print("operationQueue suspended")
if operationQueue.isSuspended {
operationQueue.isSuspended = false
print("operationQueue restarted")
}
OutPut:-
op2
op3
operationQueue suspended
operationQueue restarted
done