Cómo crear UITableViewCells con contenido complejo para seguir navegando con fluidez

Estoy trabajando en un proyecto donde tengo una vista de tabla que contiene una cantidad de celdas con contenido bastante complejo. Será entre generalmente no más de dos, pero en excepciones hasta, digamos, 30 de ellas. Cada una de estas celdas complejas contiene un gráfico lineal. Estoy usando ios-charts ( https://github.com/danielgindi/ios-charts ) para esto.

Así es como se ve el contenido del controller de vista: ver el contenido del controlador

El código que uso para eliminar las celdas en el método cellForRowAtIndexPath de viewController es uno de los siguientes:

var cell = tableView.dequeueReusableCellWithIdentifier("PerfgraphCell", forIndexPath: indexPath) as? UITableViewCell if cell == nil { let nib:Array = NSBundle.mainBundle().loadNibNamed("PerfgraphCell", owner: self, options: nil) cell = nib[0] as? FIBPerfgraphCell } cell.setupWithService(serviceObject, andPerfdataDatasourceId: indexPath.row - 1) return cell! 

y en el código de la celda tengo un método "setupWithService" que extrae las fonts de datos de un object ya existente "serviceObject" e ingresa el dibujo del gráfico, así:

 func setupWithService(service: ServiceObjectWithDetails, andPerfdataDatasourceId id: Int) { let dataSource = service.perfdataDatasources[id] let metadata = service.perfdataMetadataForDatasource(dataSource) if metadata != nil { if let lineChartData = service.perfdataDatasourcesLineChartData[dataSource] { println("starting drawing for \(lineChartData.dataSets[0].yVals.count) values") chartView.data = lineChartData } } } 

Ahora el problema: dependiendo de cuántos valores se dibujen en el gráfico (entre 100 y 2000), el dibujo parece ser bastante complejo. El usuario nota que cuando se desplaza hacia abajo: tan pronto como se va a eliminar una celda que contiene un gráfico tan complejo, el desplazamiento se atasca por un breve momento hasta que se inicializa el gráfico. ¡Eso es, por supuesto, feo!

Para tal caso, tiene sentido NO DEQUEAR las celdas a pedido, sino pnetworkingefinirlas y mantenerlas en una matriz una vez que el controller de vista reciba los datos necesarios para la representación gráfica y simplemente sacar la celda correspondiente de esta matriz cuando es necesario ¿O hay una manera de hacer que la initialization del gráfico sea asincrónica, de modo que la celda esté allí de inmediato pero el gráfico aparece siempre que está "listo"?

¡Gracias por tus respuestas!

Lo que está tratando de hacer inevitablemente se encontrará con algunos problemas de performance graves en un caso u otro. Almacenar todas las celdas (y sus datos en la memory) rápidamente utilizará la memory disponible de su aplicación. Por otro lado, la eliminación de queuepso y la recarga producirán retrasos en algunos dispositivos como lo está experimentando en este momento. Estaría mejor replanteando la architecture de su aplicación, ya sea:

1- Precalifique sus charts y exporte como imágenes. La carga de imágenes dentro y fuera de las celdas tendrá una imitación de performance mucho menor.

2- Haga que la vista de tabla se convierta en un menu desplegable donde solo muestra un gráfico a la vez.

¡Espero que esto ayude!