2012-06-23 28 views
6

Ho cercato di risolvere un mistero negli ultimi giorni sul motivo per cui il mio NSFetchedResultsController con una dimensione di batch di 20 avrebbe sempre eseguito l'errore (cioè, carica in memoria) tutti i miei oggetti immediatamente quando il recupero è terminato, causando la richiesta di prendere ~ 20 secondi.Altezza UITableView dinamica con oggetti Data Core

Si scopre che era perché nel mio heightForRowAtIndexPath, l'altezza era basata sulla lunghezza di una proprietà NSString di ogni oggetto recuperato, e così dopo aver ricaricato la tabella, se la tabella ha 2000 righe, l'altezza viene calcolata per ogni riga all'inizio, e dal momento che accedo a una proprietà testuale dell'oggetto, si verificherà un errore in 2000 oggetti (in 20 lotti di dimensioni) proprio all'inizio, causandone l'uso per sempre. (Non sapevo che l'altezza delle righe fosse calcolata tutto all'inizio).

Quindi la domanda è, se ho un controller di risultati di recupero con una dimensione di batch di 20, ma le mie altezze di riga si basano su una proprietà di testo dell'oggetto, che se provo ad accedere causerebbe l'oggetto non essere un guasto più ma effettivamente caricato in memoria, quale sarebbe una soluzione alternativa per il calcolo dell'altezza?

Quali sono le mie opzioni?

+0

Cosa succede se si verifica se l'oggetto è un errore, se lo è, restituisce una dimensione arbitraria, altrimenti ottenere la stringa e calcolare? Il metodo viene richiamato di nuovo quando la cella entra in visualizzazione? Sto solo indovinando qui. Quella o l'implementazione di un carico pigro (le nuove righe vengono aggiunte mentre scorri) sembrano essere le tue uniche opzioni. – jrturton

+0

No heightForRow viene chiamato solo all'inizio di una ricarica e non viene chiamato ogni volta che appare una cella (come farebbe cellForRow). Questo è quello che stavo pensando anche io, ma non penso che funzionerebbe .. – Snowman

+0

Pensavo che suonasse troppo facile. – jrturton

risposta

2

Interessante domanda. Quello che vorrei fare per migliorare le prestazioni sarebbe creare una proprietà nel modello che memorizza la lunghezza per quel testo stringa. In questo modo non è necessario calcolare la lunghezza per ogni riga al volo ma si dispone di un'altezza precalcolata.

Myabe ci potrebbero essere altre soluzioni di valore.

+0

Ma avrei ancora bisogno di accedere a quella proprietà intera, che farebbe sì che l'oggetto non sia più un errore e caricato in memoria .. – Snowman

+1

@mohabitar Non è del tutto vero. Se si prelettura la proprietà nella richiesta di recupero e quindi l'accesso, il testo della stringa non viene caricato in memoria finché non verrà richiesto, altrimenti la proprietà del testo rimarrà come errore. –

+0

Esatto, ma quando accedo alla proprietà stringa, l'oggetto che contiene la stringa viene caricato in memoria (perché prima era un errore, non dimostrato). – Snowman

-1

Creare un metodo statico nella classe controller di visualizzazione che è responsabile del calcolo di detta altezza. Tutto ciò che serve per fornire questa funzione è una NSString e dovrebbe restituire un CGFloat facilmente calcolato. Usa questo metodo per restituire l'altezza necessaria dei tuoi elementi senza istanziarli (tutto ciò di cui hai bisogno sono i meta-dati del loro testo).

+0

Esatto, ma in che modo il metodo dovrebbe sapere cos'è l'NSString senza creare un'istanza degli oggetti? NSString è una proprietà dell'oggetto e se l'oggetto è un errore, chiamando object.textProperty fa in modo che l'oggetto venga caricato nella memoria. – Snowman

+0

Questo problema è correlato alla tua implementazione. Forse una soluzione alternativa per ottenere queste stringhe senza costruire istanze? È il pollo e l'uovo :) – Stavash

Problemi correlati