2012-06-23 11 views
6

He estado tratando de resolver un misterio en los últimos días sobre por qué mi NSFetchedResultsController con un tamaño de lote de 20 siempre fallaría (es decir, cargaría en la memoria) todos mis objetos inmediatamente cuando la búsqueda finalizó, lo que provocó que la solicitud tardara aproximadamente 20 segundos.Altura UITableView con objetos de Datos Core

Resulta que en mi heightForRowAtIndexPath, la altura se basaba en la longitud de una propiedad NSString de cada objeto recuperado, por lo que al volver a cargar la tabla, si la tabla tiene 2000 filas, se calcula la altura para cada fila al principio, y como accedo a una propiedad de texto del objeto, fallaría en 2000 objetos (en 20 lotes de tamaño) desde el principio, lo que provocaría que durara para siempre. (No sabía que las alturas de las hileras se calcularon todas al principio).

Así que la pregunta es si tengo un controlador de resultados de búsqueda con un tamaño de lote de 20, pero mis alturas de fila se basan en una propiedad de texto del objeto, que si intento acceder causaría que el objeto no sea ya no es un error pero en realidad se cargó en la memoria, ¿cuál sería una solución para calcular la altura?

¿Cuáles son mis opciones?

+0

¿Qué sucede si comprueba si el objeto es un error, si es así, devuelve un tamaño arbitrario, de lo contrario, obtenga la cadena y calcule? ¿El método se llama nuevamente cuando la celda entra para ver? Solo estoy adivinando aquí. Eso o implementar una carga lenta (es decir, se agregan nuevas filas a medida que se desplaza) parecen ser sus únicas opciones. – jrturton

+0

No se llama a heightForRow al comienzo de una recarga y no se llama cada vez que aparece una celda (como cellForRow). Eso es lo que estaba pensando también, pero no creo que funcione. – Snowman

+0

Pensé que sonaba muy fácil. – jrturton

Respuesta

2

Interesante pregunta. Lo que haría para aumentar el rendimiento sería crear una propiedad en su modelo que almacene la longitud de ese texto de cadena. De esta forma, no necesita calcular la longitud de cada fila sobre la marcha, pero tiene una altura calculada previamente.

Myabe podría haber otras soluciones valiosas.

+0

Pero igual tendría que acceder a esa propiedad entera, lo que causaría que el objeto ya no sea un error y se cargue en la memoria ... – Snowman

+1

@mohabitar No es del todo cierto. Si capta previamente esa propiedad en su solicitud de búsqueda y luego accede a ella, el texto de cadena no se carga en la memoria hasta que lo solicite, de lo contrario, la propiedad del texto permanecerá como un error. –

+0

Correcto, pero cuando accedo a la propiedad de cadena, el objeto que contiene la cadena se carga en la memoria (porque fue un error anterior, se desinstaló). – Snowman

-1

Cree un método estático en su clase de controlador de vista que se encargue de calcular dicha altura. Todo lo que necesita para proporcionar esta función es un NSString y debería devolver un CGFloat fácilmente calculado. Utilice este método para devolver la altura necesaria de sus elementos sin instanciarlos (todo lo que necesita aquí son los metadatos de su texto).

+0

Correcto, pero ¿cómo sabe el método qué es NSString sin crear instancias de los objetos? El NSString es una propiedad del objeto, y si el objeto es un error, al llamar a object.textProperty ocasiona que el objeto se cargue en la memoria. – Snowman

+0

Este problema está relacionado con su implementación. Tal vez una solución para obtener estas cadenas sin construir instancias? Es el huevo y la gallina :) – Stavash

Cuestiones relacionadas