2011-03-07 30 views
6

A partir de los documentos:iOS - ¿Cómo verificar si una NSOperation está en un NSOperationQueue?

Un objeto operación puede ser de a lo sumo una cola de operaciones a la vez y este método produce una excepción NSInvalidArgumentException si la operación ya está en otra cola. De forma similar, este método arroja una excepción NSInvalidArgumentException si la operación se está ejecutando actualmente o ya ha finalizado la ejecución.

Entonces, ¿cómo puedo comprobar si puedo agregar con seguridad un NSOperation en una cola?

La única forma que conozco es agregar la operación y luego tratar de detectar la excepción si la operación ya está en una cola o se ha ejecutado antes.

Respuesta

14

NSOperationQueue objetos tienen una propiedad llamada operations.

Si tiene una referencia a sus colas, es fácil de verificar.

Puede comprobar si el NSArray de operaciones contiene su NSOperation así:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

NSOperation *operation = [[NSOperation alloc] init]; 

[queue addOperation:operation]; 

if([queue operations] containsObject:operation]) 
    NSLog(@"Operation is in the queue"); 
else 
    NSLog(@"Operation is not in the queue"); 

O puede iterar sobre todos los objetos:

for(NSOperation *op in [queue operations]) 
    if (op==operation) { 
     NSLog(@"Operation is in the queue"); 
    } 
    else { 
     NSLog(@"Operation is not in the queue"); 
    } 

Dime si esto es lo que busca para.

Como alternativa, los objetos NSOperation tienen varias propiedades que le permiten verificar su estado; tales como: isExecuting, isFinished, isCancelled, etc ...

+0

, pero ¿qué ocurre si tengo varias colas de operaciones? ¿Debería revisarlo para cada cola de operación? Puedo hacerlo pero, ¿es esta la mejor manera posible? –

+1

@ xlc0212: Otra solución que puedo pensar es subclase NSOperation, que en realidad es alentada por Apple; y agregue una propiedad booleana "isInQueue" que se marque como YES cuando la agregue a una cola. De esta manera, solo necesita verificar esta propiedad antes de agregar operaciones a las colas. – Zebs

+0

¿cuándo debería marcar la operación? ¿Debo configurarlo manualmente antes de agregarlo en la cola o si debo anular algún método que invocará la cola y luego establecer el indicador –

4

Cuando se agrega un objetoNSOperation a un NSOperationQueue, la NSOperationQueue retiene el objeto, por lo que el creador de la NSOperation puede liberarlo . Si se mantiene con esta estrategia, NSOperationQueues siempre será el único dueño de sus NSOperation objetos, por lo que no serán capaces de agregar un objetoNSOperation a cualquier otra cola.

Si todavía desea hacer referencia individuales NSOperation objetos después de que han sido añadidos a la cola, puede hacerlo utilizando el método - (NSArray *)operationsNSOperationQueue 's.

Cuestiones relacionadas