I've got a bunch of NSOperations
added to a NSOperationQueue
. The operation queue has the maxConcurrentOperationCount
set to 1, so that the NSOperations
run one after the other.
Now, in the completionBlock
of a NSOperation
I want to cancel all pending NSOperations
by calling cancelAllOperations
on the NSOperationQueue
.
Is it safe to do this? Can I be sure that the start
-method of the next operation is called only after the completionBlock
of the previous operation has been fully executed? Or do the completionBlock
of the previous operation and the task of the current operation run concurrently?
The reason why I'm asking: I use AFNetworking to execute a batch of AFHTTPRequestOperations
and want to perform one request only if all previous requests of the batch were successful.
My findings below no longer seem to be true. I've re-run the tests on iOS 8 and iOS 9 and the completion block of an operation always runs concurrently with the next operation. Currently, I don't see a way to make an operation wait for the previous completion block to finish.
I just tried this scenario in a sample project. Here is the result:
If the NSOperationQueue
's maxConcurrentOperationCount
is set to 1, an NSOperation
's completionBlock
and the next NSOperation
in the queue run simultaneously.
But, if every NSOperation
is linked to its previous operation by calling addDependency:
, the execution of an operation waits until the previous operation's completionBlock
has finished.
So, if you want to cancel the next operation in the completionBlock
of the current operation and be sure that it is cancelled before it is started, you have to set dependencies between the NSOperations
by calling addDependency: