2009-02-27 10 views
5

Sono curioso di sapere quanto siano costose in termini di risorse il reloadData di UITableView? Ho un'app che farà circa 10 richieste HTTP successive, e man mano che recupera dati/prep, ricarica la tabellaView. Poiché il set di dati diventa sempre più grande, sta diventando molto lento. Sto cercando di capire se è a causa della quantità di volte che sto ricaricando il TableView o per come sto afferrando/analizzando i dati.Quanto è costoso il reloadData di UITableView?

Qual è la migliore pratica in questo caso?

risposta

5

La migliore pratica è fare in modo che l'implementazione di cellForRowAtIndexPath: esegua il minor lavoro possibile. In realtà, non dovrebbe funzionare in alcun modo se non si compila l'istanza UITableViewCell con i dati che deve essere visualizzato.

Si dovrebbe utilizzare cache UITableViewCell s in modo da non dover assegnare una nuova cella ogni volta. Se è possibile eseguire il parsing e simili in un thread separato e rendere i dati analizzati, pronti per essere presentati, accessibili a cellForRowAtIndexPath:, non si dovrebbero avere problemi di prestazioni.

Non hai detto se stavi usando una sottoclasse personalizzata UITableViewCell, ma se lo sei, le gerarchie di viste profonde possono anche presentare un problema di prestazioni, dal momento che ogni vista nella gerarchia viene disegnata. Il più piatto è possibile fare UITableViewCell s, meglio è.

Spero che ti faccia muovere nella giusta direzione.

+0

Se sta facendo richieste HTTP, credo che quelle stiano andando su un thread diverso gratuitamente, a meno che non lo dite esplicitamente di non farlo. –

4

La cosa migliore da fare è profilare l'app per vedere dove è lenta.

Detto questo, se le vostre celle della tabella sono tutti della stessa altezza, quindi penso

reloadData

deve solo chiamare

cellForRowAtIndexPath

per le celle che sono visibili sullo schermo.

1

Boot To The Head è corretto.

Sto eseguendo un aggiornamento progressivo di una lista di articoli in Instapaper e chiamo -reloadData su ogni download completato. Sembra simile a quello che stai facendo. Non provoca alcun rallentamento delle prestazioni evidente.

2

Tabella vista ricarica spesa è:

  1. Capire quante sezioni e righe per sezioni avete
  2. ottenere l'altezza delle righe.

Le altezze di riga in particolare sono calcolate per tutti gli elementi della tabella, ogni volta che si chiamano i dati di ricarica.

La spesa rimanente è cellForRowAtIndexPath, che di solito non è male perché viene chiamato solo per il numero di righe sullo schermo. Può essere brutto quando si scorre se non si riutilizzano le celle come si suppone.

La chiave per te è probabilmente, chiedersi cosa fa scattare il carico HTML e spostarlo eventualmente in un thread in background.

15

Da UITableView.h:

- (void)reloadData;     // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks 

"Questo è a buon mercato."

implementare correttamente i metodi di visualizzazione tabella e non sarà un grosso problema chiamare questa funzione tutto il tempo.

In una nota a margine, si dovrebbe provare a utilizzare i metodi appropriati per animare l'aggiunta e la rimozione di righe se si pensa di utilizzare reloadData per quello.

+1

+1 per l'utilizzo della documentazione! – wjl

Problemi correlati