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:
Non è deprecato. È normale che Apple annulli i metodi che non sono più utili.
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 NSOperation
start
è invitato. Il cambiamento ha causato un problema discusso in QA1712.
Hai letto la documentazione? Sembra che questo sia spiegato abbastanza bene. –
Ho cercato di aggiungere una risposta più concisa data la discussione. –