How can I Pause a NSOperation in a NSOperationQueue? How can I Pause a NSOperation in a NSOperationQueue? ios ios

How can I Pause a NSOperation in a NSOperationQueue?


see this: Link

And here from the apple docs:

Suspending and Resuming Queues If you want to issue a temporary halt to the execution of operations, you can suspend the corresponding operation queue using the setSuspended: method.

Suspending a queue does not cause already executing operations to pause in the middle of their tasks. It simply prevents new operations from being scheduled for execution. You might suspend a queue in response to a user request to pause any ongoing work, because the expectation is that the user might eventually want to resume that work.


I've not tried this, but I would probably start here:

  • add a isPaused flag to your NSOperation subclass
  • implement a copy/move method for the operation's data
  • if paused, setCancelled: (watch for this change in -main)
  • create a new operation moving the state from paused operation to new operation
  • adjust priority to reorder operation order in queue, if you like
  • add the clone to the queue
  • return from -main if in -main

note that this will just suspend it. if you really want to pause and explicitly resume, you would manually 'new operation` when you want to resume.

now, if you are observing or have special completions, then you will have a few other problems. for simple cases, it seems this approach would seem to work fine.


In Swift 5, you can use isSuspended property to pause and resume yourOperationQueue, you can see the example for more understanding:-

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 = trueprint("operationQueue suspended")if operationQueue.isSuspended {    operationQueue.isSuspended = false    print("operationQueue restarted")}OutPut:- op2op3operationQueue suspendedoperationQueue restarteddone