2013-08-21 13 views
6

Perché NSOperationQueue esegue sempre le attività su una nuova discussione, Sono confuso sul ruolo di isConcurrent quando NSOperation viene eseguito da NSOperationQueue.Che cosa significa isConcurrent per NSOperation in esecuzione da NSOperationQueue?

se ho due sottoclassi di NSOperation, entrambi in esecuzione un processi asincroni, entrambi sono lanciati da NSOperationQueue e in entrambi sovrascrivo isCancelled, isExecuting, isFinished e isReady. Quale sarà la differenza se a uno ho la precedenza su e l'altra su return NO.

Chi chiama in realtà isConcurrent? Come cambia la logica se è NO o YES.

+3

Hai letto la documentazione? Sembra che questo sia spiegato abbastanza bene. –

+0

Ho cercato di aggiungere una risposta più concisa data la discussione. –

risposta

6

È un metodo legacy, utilizzato prima di OS X v10.6 e prima di iOS 4, ossia prima dell'introduzione di GCD per la spedizione NSOperationQueue.

Dalle doc

code funzionamento solito forniscono i fili utilizzati per eseguire le operazioni. In OS X v10.6 e versioni successive, le code di operazione utilizzano la libreria libdispatch (nota anche come Grand Central Dispatch) per avviare l'esecuzione delle loro operazioni. Di conseguenza, le operazioni sono eseguite sempre su un thread separato, indipendentemente dal fatto che siano designate come operazioni concorrenti o non simultanee. In OS X v10.5, tuttavia, le operazioni vengono eseguite su thread separati solo se il loro metodo isConcurrent restituisce NO. Se quel metodo restituisce SÌ, è previsto che l'oggetto operazione crei il proprio thread (o avvii un'operazione asincrona); la coda non fornisce un thread per questo.

Se stai utilizzando OS X> = 10.6 o iOS> = 4, puoi tranquillamente ignorarlo.

A conferma di questo fatto, dal documento di isConcurrent

In OS X 10.6 e successivamente, code funzionamento ignorare il valore restituito da questo metodo e sempre avviare operazioni su un thread separato .

+0

I down hanno votato questa risposta perché non penso che sia la conclusione principale che 'isConcurrent' può essere tranquillamente ignorato dopo 10.6 o iOS4 è corretto, dato che il metodo non è stato deprecato. –

+0

Non è deprecato perché non si richiama il metodo, lo si sovrascrive. Questo metodo è chiamato dall'implementazione interna di Apple di 'NSOperationQueue' e afferma esplicitamente che ignorerà il suo valore di ritorno. –

+0

Non vedo il collegamento tra invocare vs ignorare e deprecare. Le virgolette della documentazione mostrano una variazione nel modo in cui il metodo viene utilizzato ora rispetto al passato. Non penso che questo significhi che non potrebbe cambiare di nuovo in futuro, o che non è usato da nessun'altra parte, quindi dovresti semplicemente ignorarlo. Penso che fino a quando non sia deprecato dovresti restituire la risposta corretta, anche se sospetti che non sia attualmente in uso. –

2

Ho aggiunto una risposta più concisa ora, ha lasciato questo per il momento come è stato parte di una discussione ...


Ok, ero abbastanza contento del mio utilizzo del isConcurrent metodo fino ad oggi!

ho letto la frase:

In OS X v10.6 e successive, le code di funzionamento ignorare il valore restituito da questo metodo e sempre avviare le operazioni su un thread separato.

Come avvertimento relativo QA1712, sottolineando che per le operazioni simultanee il metodo start può ora essere chiamato un thread diverso da quello che coda l'operazione, che è un cambiamento di 10.6 e iOS 4.

Non ho letto questo perché indica che il metodo isConcurrent viene ignorato completamente dalla coda e non ha alcun scopo, solo che non influisce più sul thread su cui viene chiamato start. Potrei aver frainteso questo.

Ho anche capito la domanda originale come una più generale su operazioni simultanee e la bandiera isConcurrent, e la risposta accettata nel modo più efficace dire

La bandiera isConcurrent può essere ignorato dal 10.6 e iOS 4

Non sono sicuro che sia corretto.

Se ho ben capito la domanda originale ora, per parafrasare:

Dato un correttamente costruito concomitante NSOperation fa la bandiera isConcurrent in sé in realtà alterare l'esecuzione dell'operazione a tutti?

Credo che sia difficile dire per tutte le possibili configurazioni, ma possiamo dire che:

  1. Non è deprecato. È normale che Apple annulli i metodi che non sono più utili.

  2. La documentazione si riferisce in modo coerente al metodo richiesto come sostituzione .

Forse isConcurrent è effettivamente deprecato, ma dato che è solo un singolo BOOL bandiera forse non vale la pena lo sforzo per deprecare che nella documentazione. O forse non fa nulla ora, ma Apple lo ha tenuto per un possibile uso futuro e si aspetta che tu lo sovrascriva come descritto.

Ho creato un progetto di test veloce con un NSOperation che overrode isConcurrent e main solo, isConcurrent non è stato chiamato in qualsiasi momento. E 'stato un test molto semplice però. Suppongo che potresti averlo provato anche tu? Supponevo che forse NSOperationQueue non lo chiamasse NSOperation's implementazione predefinita di start.

Quindi, dove ci lascia? Ovviamente non è un problema implementarlo e restituire YES per soddisfare i requisiti documentati. Tuttavia, dal mio punto di vista penso che sia un passo in più per passare dall'avvertenza riguardante 10.6 e iOS 4.0 per dire che ora può essere tranquillamente ignorato.


mia risposta iniziale ...

isConcurrent non è un metodo legacy e non viene ignorato da NSOperationQueue. La documentazione citata nelle altre risposte è un po 'poco chiara e facilmente fraintesa.

isConcurrent = YES significa che l'operazione fornisce i propri mezzi di concorrenza. O per dirla in altro modo, l'operazione "isAlreadyConcurrent" e non ha bisogno dello NSOperationQueue per fornire e gestire la concorrenza. Poiché NSOperationQueue non fornisce più la concorrenza necessaria per comunicarlo quando l'operazione è isFinished o se è isCancelled (ecc.), È quindi necessario sovrascrivere questi metodi.

Un esempio comune è un NSOperation che gestisce un NSURLConnection. NSURLConnection ha il proprio meccanismo per l'esecuzione in background, quindi non è necessario renderlo simultaneo da NSOperationQueue.

Una domanda ovvia è quindi: "Perché mettere un'operazione già concomitante in un NSOperationQueue?" E 'così l'operazione può beneficiare delle altre caratteristiche del NSOperationQueue come dipendenze ecc

La parte ingannevole della documentazione si riferisce solo a ciò che infilare il metodo di un NSOperationstart è invitato. Il cambiamento ha causato un problema discusso in QA1712.

+0

L'ho preso dalla documentazione, ma questo non risponde alla mia domanda. Partendo dal presupposto che sovrascrivo tutti i metodi NSOperation e lo eseguo sotto NSOperationQueue, come fa l'impostazione isConcurrent a YES o NO a fare la differenza? – amit

+0

Si dice "e non viene ignorato da NSOperationQueue", quindi perché la documentazione dice "le code di operazioni ignorano il valore restituito da questo metodo"? –

+0

Ciao David, ho aggiunto alcune spiegazioni su come ho interpretato quella citazione nei documenti. Penso che i documenti siano confusi, ma potrei semplicemente confondermi :-). Non sono ancora sicuro della mancanza di una deprecazione formale e il suo uso nel resto della documentazione è sicuro di ignorare semplicemente 'isConcurrent' dopo 10.6 e iOS4 ... –

0

Parafrasando la domanda originale:

Dato un corretto costruita concomitante NSOperation fa il valore restituito da isConcurrent effettivamente alterano l'esecuzione dell'operazione affatto?

Mentre potremmo cercare di capire come la bandiera isConcurrent viene utilizzato da NSOperation, NSOperationQueue, o di altre parti del sistema operativo, sarebbe un errore fare affidamento su qualsiasi informazione abbiamo scoperto.

Scopo della bandiera è descritto come:

ritorno YES se l'operazione viene eseguito in modo asincrono rispetto al thread corrente o NO se l'operazione viene eseguito in modo sincrono su qualunque filo iniziato.

Finché si risponde correttamente, non dovrebbe essere importante chi chiama il metodo o come influenza qualsiasi logica all'interno dei framework Apple.


Note aggiuntive:

La documentazione fa fare riferimento a un cambiamento nel modo in cui NSOperationQueue utilizzato questo valore prima e dopo OSX 10.6 e iOS 4.0.

In OS X v10.6, le code di operazioni ignorano il valore restituito da isConcurrent e chiamano sempre il metodo di avvio dell'operazione da un thread separato. In OS X v10.5, tuttavia, le code di operazioni creano un thread solo se isConcurrent restituisce NO. ...

Questa modifica ha causato un problema descritto in QA1712.

Questo commento viene comunemente interpretato per implicare che il flag isConcurrent non è più utilizzato dopo 10.6 e iOS 4 e può essere ignorato. Non sono d'accordo con questa interpretazione in quanto il metodo non è stato formalmente deprecato ed è ancora documentato come una sovrascrittura necessaria per le operazioni concorrenti.

Anche il fatto che sia stato utilizzato in passato è un promemoria che potrebbe cambiare in futuro, quindi dovremmo rispondere correttamente anche se sospettiamo che attualmente non abbia alcun effetto.