Quiero desasignar NSOperationQueue cuando todas las operaciones en curso hayan terminado de ejecutarse. Hasta ahora, he codificado a continuación, pero hasta donde yo sé waitUntilAllOperationsAreFinished es una llamada asíncrona y no pude mantener mi operaciónQueue obteniendo cero.

- (void)deallocOperationQueue
{
    [operationQueue waitUntilAllOperationsAreFinished];
    operationQueue = nil;
}
0
Pankaj Gaikar 18 ago. 2016 a las 13:18

2 respuestas

La mejor respuesta

Citando Avi

No es necesario esperar a que finalicen todas las operaciones. Simplemente establezca operationQueue en nil cuando haya terminado. Si la cola todavía tiene operaciones, no les pasa nada; todavía se completarán.

- (void)deallocOperationQueue
{
    operationQueue = nil;
}

He probado el código y confirmo que se produce el comportamiento indicado.

1
Pankaj Gaikar 22 ago. 2016 a las 13:47

Puede crear una subclase de una NSOperationQueue y observar la ruta de la clave de operaciones hasta que llegue a cero:

class DownloadOperationQueue: NSOperationQueue {

    private static var operationsKeyPath: String {
        return "operations"
    }

    deinit {
        self.removeObserver(self, forKeyPath: "operations")
    }

    var completionBlock: (() -> Void)? {
        didSet {
            self.addObserver(self, forKeyPath: DownloadOperationQueue.operationsKeyPath, options: .New, context: nil)
        }
    }

    override init() {
        super.init()
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if let operationPath = keyPath where operationPath == DownloadOperationQueue.operationsKeyPath {
            if self.operations.count == 0 {
                NSOperationQueue.mainQueue().addOperationWithBlock({ 
                    self.completionBlock?()
                })
            }
        }
    }

}

Cuando esté completo:

var operationQueue: DownloadOperationQueue? = DownloadOperationQueue()

// Add your operations ...

operationQueue?.completionBlock = {
    operationQueue = nil
}
0
Danny Yassine 18 ago. 2016 a las 12:25