2009-07-18 14 views
5

Esiste un modo sicuro per modificare la priorità di una NSOperazione già accodata in un NSOperationQueue? Se l'operazione non è ancora iniziata, non ci sono problemi, ma se è già in esecuzione ottengo un NSInvalidArgumentException.Modo sicuro per modificare la priorità di una NSOperazione

+1

ci mostri la traccia dello stack e il contenuto della deroga? È un po 'difficile da diagnosticare al momento –

risposta

11

Non si deve alterare una NSOperation una volta che è stato accodato. Secondo Threading Programming Guide di Apple:

Importante: non si dovrebbe mai modificare un oggetto operazione dopo che è stato aggiunto a una coda. Durante l'attesa in una coda , l'operazione potrebbe essere eseguita a in qualsiasi momento. Cambiare il suo stato mentre è in esecuzione potrebbe avere effetti negativi . È possibile utilizzare i metodi di l'oggetto operazione per determinare se l'operazione è , in attesa di esecuzione o già completata.

+0

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

+0

@MichaelBaltaks - Grazie, aggiornato. –

0

Sul numero docs non viene visualizzato alcun avviso relativo alla modifica della priorità dopo l'avvio dell'operazione e non vengono menzionate eccezioni sollevate.

In effetti, la modifica della priorità di un'operazione in esecuzione non ha alcun effetto. Forse stai facendo qualcosa di sbagliato altrove?

1

Secondo Concurrency Programming Guide dovremmo essere in grado di modificare la priorità

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. 
Problemi correlati