2009-07-18 14 views
5

¿Existe una manera segura de cambiar la prioridad de una NSOperation que ya está en cola en un NSOperationQueue? Si la operación aún no ha comenzado, no hay problema, pero si ya se está ejecutando, obtengo una NSInvalidArgumentException.Manera segura de cambiar la prioridad de una NSOperation

+1

nos muestras el seguimiento de la pila y el contenido de la excepción? Es un poco difícil de diagnosticar en este momento –

Respuesta

11

Se supone que no debe alterar una NSOperation una vez que se ha puesto en cola. De acuerdo con Threading Programming Guide de Apple:

Importante: Nunca se debe modificar un objeto operación después de que haya sido añaden a una cola. Mientras esperaba en una cola , la operación podría ejecutarse en en cualquier momento. Cambiar su estado mientras se está ejecutando podría tener efectos adversos . Puede usar los métodos de el objeto de operación para determinar si la operación se está ejecutando, esperando a que se ejecute , o si ya terminó.

+0

Enlace actualizado: http://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091 -CH101-SW38 –

+0

@MichaelBaltaks - Gracias, actualizado. –

0

En el docs no hay ninguna advertencia acerca de no cambiar la prioridad después de que se haya iniciado la operación y no se menciona excepciones planteadas.

De hecho, cambiar la prioridad de una operación en ejecución simplemente no tiene ningún efecto. ¿Tal vez estás haciendo algo mal en otro lado?

1

Según Concurrency Programming Guide que debe ser capaz de cambiar la prioridad

For operations added to a queue, execution order is determined first by the 
readiness of the queued operations and then by their relative priority. 
Readiness is determined by an operation’s dependencies on other operations, 
but the priority level is an attribute of the operation object itself. 
By default, all new operation objects have a “normal” priority, but you 
can increase or decrease that priority as needed by calling the object’s 
setQueuePriority: method. 
Cuestiones relacionadas