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.

È stato utile?

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]);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top