Tristemente penso che gli NSOperationQueue
s siano, come suggerisce il nome, utilizzabili solo come code - non come pile. Per evitare di dover eseguire un intero gruppo di marshalling manuale delle attività, probabilmente la cosa più semplice è trattare le code come se fossero immutabili e mutare copiando. Per esempio.
- (NSOperationQueue *)addOperation:(NSOperation *)operation toHeadOfQueue:(NSOperationQueue *)queue
{
// suspending a queue prevents it from issuing new operations; it doesn't
// pause any already ongoing operations. So we do this to prevent a race
// condition as we copy operations from the queue
queue.suspended = YES;
// create a new queue
NSOperationQueue *mutatedQueue = [[NSOperationQueue alloc] init];
// add the new operation at the head
[mutatedQueue addOperation:operation];
// copy in all the preexisting operations that haven't yet started
for(NSOperation *operation in [queue operations])
{
if(!operation.isExecuting)
[mutatedQueue addOperation:operation];
}
// the caller should now ensure the original queue is disposed of...
}
/* ... elsewhere ... */
NSOperationQueue *newQueue = [self addOperation:newOperation toHeadOfQueue:operationQueue];
[operationQueue release];
operationQueue = newQueue;
Sembra al momento che il rilascio di una coda che sta ancora lavorando (come accadrà alla vecchia coda di operazione) non causa per annullare tutte le operazioni, ma che non è documentato comportamento in modo probabilmente non degno di fiducia. Se si desidera essere veramente sicuri, il valore-chiave osserva la proprietà operationCount
nella vecchia coda e la rilascia quando va a zero.
I belive questo dovrebbe funzionare, ho deciso di creare solo il mio proprio stack da un NSMutableArray. Grazie per l'input. – Padin215
Per la cronaca, avrei evitato di creare il mio stack personale perché sei quindi responsabile dell'emissione di operazioni e del monitoraggio dei loro progressi, cioè finisci per reimplementare molte delle funzioni di 'NSOperationQueue'. Se stessimo usando operazioni simultanee, avreste praticamente finito per essere meno efficienti. Ovviamente niente di tutto ciò è rilevante per le tue esigenze specifiche e sono sicuro che stai facendo la cosa giusta, ho solo pensato di dirlo per completezza. – Tommy
sto creando una serie di URL che ho bisogno di chiamare per una tessera WMS. controllo se ho X tile, se non è in una cache, ho messo l'URL in pila. Ho un timer che spara sempre 2 secondi che creerà la richiesta e metterlo in una coda GDC da eseguire. – Padin215