2012-05-08 19 views
7

Digamos que tengo una cola de envío en serie y pongo en cola varias operaciones en ella. He leído que no puedo cancelar operaciones una vez que se envían. ¿Es posible, por lo menos, ver qué bloques de GCD he despachado para quizás tomar una decisión si quiero enviar otro?¿Inspeccionar los bloques GCD en cola?

Ejemplo, envío la Operación A a la cola, pero poco después mi aplicación decide poner en cola otra Operación A, por lo que ahora hay 2 de estas operaciones en cola.

+1

Se puede elaborar en lo que estás tratando de hacer? Hay una serie de soluciones basadas en cuáles son sus objetivos reales. –

Respuesta

0

Desde NSOperation ahora se construye en la parte superior del GCD, ahora se puede utilizar addOperationWithBlock: poner su bloque en una NSOperationQueue, entonces se puede invocar operaciones en el NSOperationQueue para obtener una NSArray de las operaciones sin terminar.

El problema con esto, es que se trata de más de dos operaciones y no es atómico, por lo que es muy posible que su operación finalizará en entre el momento de recibir los operaciones matriz y ver si está contenida allí.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

NSOperations tienen una API requisito, sin embargo, por lo que puede poner en cola otra operación que sólo se ejecutará si su primera NSOperation termina, y usar esto para no perder de vista cuando se debe tratar de poner en cola el primer NSOperation nuevo .

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591

2

Como dijo Kevin Ballard, tiene que explicar qué es exactamente lo que está tratando de hacer. Una cosa que podría hacer es establecer una bandera, como valid_ y luego se puede cancelar con eficacia todos, pero el elemento actual en la cola haciendo algo como esto:

dispatch_async(queue, ^{ 
    if (valid_) { 
    // perform your task here 
    } 
}); 

Entonces cada vez que desee "cancelar" la cola, simplemente configure su bandera valid_ en NO.

De nuevo, da más información sobre lo que estás tratando de hacer y puedo darte una mejor respuesta.

Cuestiones relacionadas