Tengo UITableView
. en el método tableView:cellForRow:atIndexPath:
(cuando los datos se agregan a las celdas) Implementé algún tipo de carga diferida. Si no hay ningún objeto para la clave (clave == número de fila) en rowData
NSDictionary
, el programa inicia el método requestDataForRow:
en segundo plano. para que los datos en las celdas se llenen un poco después de que la celda se vuelva visible. Aquí está el código:UITableView optimización de carga diferida
static int requestCounter=0;
-(void)requestDataForRow:(NSNumber *)rowIndex
{
requestCounter++;
//NSLog(@"requestDataForRow: %i", [rowIndex intValue]);
PipeListHeavyCellData *cellData=[Database pipeListHeavyCellDataWithJobID:self.jobID andDatabaseIndex:rowIndex];
[rowData setObject:cellData forKey:[NSString stringWithFormat:@"%i", [rowIndex intValue]]];
requestCounter--;
NSLog(@"cellData.number: %@", cellData.number);
if (requestCounter==0)
{
//NSLog(@"reloading pipe table view...");
[self.pipeTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
};
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"pipeCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
[[NSBundle mainBundle] loadNibNamed:@"PipesForJobCell" owner:self options:nil];
cell = pipeCell;
self.pipeCell = nil;
PipeListHeavyCellData *cellData=[[PipeListHeavyCellData alloc] init];
if ([rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]]==nil)
{
//NSLog(@" nil data for row: %i", indexPath.row);
[self performSelectorInBackground:@selector(requestDataForRow:) withObject:[NSNumber numberWithInt:indexPath.row]];
}
else
{
//NSLog(@" has data for row: %i", indexPath.row);
PipeListHeavyCellData *heavyData=[[PipeListHeavyCellData alloc] init];
heavyData=(PipeListHeavyCellData *)[rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]];
cellData._id=[heavyData._id copy];
cellData.number=[heavyData.number copy];
cellData.status=[heavyData.status copy];
};
Este código funciona, todo está bien, pero mi mesa tiene 2000 filas y si los usuarios se desplaza desde la célula con el índice de 10 a teléfonos con el índice 2000 muy rápidamente. Debe esperar durante un tiempo prolongado hasta que se completen todas las solicitudes de datos (para las filas 11, 12, 13, ..., 2000) porque las filas se hicieron visibles mientras el usuario desplazaba la vista de tabla, por lo que se solicitó el método requestDataForRow
.
¿Cómo puedo optimizar esas cosas?
Aquí hay una gran pregunta con el mismo problema con varias soluciones muy buenas (con código): http://stackoverflow.com/q/7567827/937822 – lnafziger