Esiste un modo semplice per scorrere indietro su un NSArray?
-
20-08-2019 - |
Domanda
Ho un NSArray
e devo ripassare su di esso in un caso speciale all'indietro, in modo da prima guardare l'ultimo elemento. È per motivi di prestazioni: se l'ultimo non ha senso, tutti i precedenti possono essere ignorati. Quindi vorrei interrompere il ciclo. Ma ciò non funzionerà se si procede in avanti da 0 a n. Devo andare da n a 0. Forse c'è un metodo o una funzione che non conosco, quindi non avrei dovuto reinventare la ruota qui.
Soluzione
Per aggiungere altre risposte, puoi usare -[NSArray reverseObjectEnumerator]
in combinazione con la funzione di enumerazione rapida in Objective-C 2.0 (disponibile in Leopard, iPhone):
for (id someObject in [myArray reverseObjectEnumerator])
{
// print some info
NSLog([someObject description]);
}
Fonte con qualche informazione in più: http://cocoawithlove.com/2008/ 05 / fast-enumerazione-clarifications.html
Altri suggerimenti
Dal momento che questo è per performace, hai una serie di opzioni e ti consigliamo di provarle tutte per vedere quale funziona meglio.
-
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
-
-[NSArray reverseObjectEnumerator]
- Crea una copia inversa dell'array e quindi scorrere attraverso ciò normalmente
- Utilizza una C standard per il ciclo e avvia e lavora all'indietro attraverso l'array.
Metodi più estremi (se le prestazioni sono super critiche)
- Leggi come Cocoa implementa la rapida enumerazione degli oggetti e crea il tuo equivalente al contrario.
- Utilizza un array C o C ++.
Potrebbero essercene altri. In tal caso, chiunque si senta libero di aggiungerlo.
Da qui :
NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
id anObject;
while( anObject = [myIterator nextObject])
{
/* do something useful with anObject */
}
[NsArray reverseObjectEnumerator]
for (int i = ((int)[array count] - 1); i > -1; i--) {
NSLog(@"element: %@",array[i]);
}