per fare un semplice FIFO utilizzando nsInvocationopration Sarà necessario impostare una sola operazione per essere dipendeva dall'altra Utilizzando addDependency:. Metodo
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *oper1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSth:) object:@"1"];
NSInvocationOperation *oper2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSth:) object:@"2"];
NSInvocationOperation *oper3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSth:) object:@"3"];
[oper2 addDependency:oper1];
[oper3 addDependency:oper2];
//oper3 depends on oper2 wich depends on oper1
//order of execution will ber oper1->oper2->oper3
//Changing the oreder will not change the result
[queue addOperation:oper2];
[queue addOperation:oper3];
[queue addOperation:oper1];
- (void) doSth:(NSString*)str
{
NSLog(str); //log will be 1 2 3
//When you remove the addDependency calls, the logging result that i got where
//different between consecutive runs i got the following
//NSLog(str); //log will be 2 1 3
//NSLog(str); //log will be 3 1 2
}
Nota: se si utilizza NSInvocationOperation
quindi impostando il maxConcurrentOperationCount
-1 molto probabilmente fare il trucco per voi, dal momento che isReady non sarà modificabile da voi
Ma maxConcurrentOperationCount
= 1 non sarebbe una buona soluzione se state programmando di creare i propri sottoclassi di NSOperation
Dal momento in derivati NSOperation si poteva ignorare la funzione isReady
e tornare non, (immaginate qualche operazione che avrebbe bisogno di attendere alcuni dati da un server per poter funzionare correttamente) in questi casi che ci si ritorni isReady no
fino a quando si è veramente pronti in questi casi sarà necessario aggiungere dependencies
tra operations
all'interno della coda di
da docs apple , equivale a una coda di serie . Tuttavia, non si dovrebbe mai fare affidamento sull'esecuzione seriale di oggetti operativi. Le modifiche alla disponibilità di un'operazione possono modificare l'ordine di esecuzione risultante
fonte
2012-06-08 12:31:43
ordine di esecuzione dipende anche la priorità della coda dell'operazione. – JeremyP
Molto vero. Aggiornato. –
Quindi, se le mie operazioni hanno tutte la stessa priorità, non hanno dipendenze e si basano solo sull'implementazione della superclasse di 'isReady' (non sovrascrivo) dovrebbe risultare in una coda FIFO? – Barjavel