PSOperations
PSOperations copied to clipboard
Cancelling group operation
Was wondering what people's thoughts are on the GroupOperation
cancellation. I'm in a situation where the queue (or GroupOperation
directly) gets cancelled. The cancel method on GroupOperation
will then cancel all the internal queue operations and finally call super.cancel()
.
The issue is that the queue delegate may (race condition) finish all the internal operations before super is called. Which means the operationQueue(operationQueue: OperationQueue, operationDidFinish operation: NSOperation, withErrors errors: [NSError])
could trigger (on a separate thread) finish(aggregatedErrors)
. Then all the observers / didFinishCalls / etc... will get called before the cancelled flag is set.
I'm thinking it only really affects GroupOperation
more so than Operation
given the way finishingOperation works; but in technically its possible to cancel any operation on a given thread and it finish on another a different on another leading to race conditions and mixed results when notified upon completion and investigating cancelled state.
My proposal:
Change
override public func cancel() {
internalQueue.cancelAllOperations()
internalQueue.suspended = false
super.cancel()
}
To
override public func cancel() {
super.cancelWithErrors(aggregatedErrors)
internalQueue.cancelAllOperations()
internalQueue.suspended = false
}
That way when the internal queue finishes cancelling all the individual operations the overall GroupOperation
will be properly marked cancelled
Or add a lock around the original lines in cancel()
and the finish(aggregatedErrors)
in the queue callback.