Espere a que todas las operaciones en queue finalicen antes de realizar la tarea

Tengo una subclass de operación y queue de operaciones con maxConcurrentOperationCount = 1.

Esto realiza mis operaciones en un order secuencial que las agrego, lo cual es bueno, pero ahora tengo que esperar hasta que todas las operaciones hayan finalizado antes de ejecutar otro process.

Intentaba usar el grupo de notifications pero como esto se ejecuta en un bucle for tan pronto como las operaciones se agregaron a la queue, el grupo de notifications se dispara … ¿Cómo espero que todas las operaciones dejen la queue antes de ejecutar otro process?

for (index, _) in self.packArray.enumerated() { myGroup.enter() let myArrayOperation = ArrayOperation(collection: self.outerCollectionView, id: self.packArray[index].id, count: index) myArrayOperation.name = self.packArray[index].id downloadQueue.addOperation(myArrayOperation) myGroup.leave() } myGroup.notify(queue: .main) { // do stuff here } 

Puede usar dependencies de operación para iniciar alguna operación luego de completar una serie de otras operaciones:

 let operationQueue = OperationQueue() let completionOperation = BlockOperation { // do something } for object in objects { let operation = ... completionOperation.addDependency(operation) operationQueue.addOperation(operation) } OperationQueue.main.addOperation(completionOperation) 

Una solución adecuada es KVO

Primero antes del bucle, agregue el observador (suponiendo que la queue es la instancia de OperationQueue )

 queue.addObserver(self, forKeyPath:"operations", options:.new, context:nil) 

Luego implementa

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if object as? OperationQueue == queue && keyPath == "operations" { if queue.operations.isEmpty { // Do something here when your queue has completed self.queue.removeObserver(self, forKeyPath:"operations") } } else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) } }