2012-05-15 18 views
6

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 rowDataNSDictionary, 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?

+1

Aquí hay una gran pregunta con el mismo problema con varias soluciones muy buenas (con código): http://stackoverflow.com/q/7567827/937822 – lnafziger

Respuesta

4

Tuve que hacer algo similar. Tendrá que crear una cola que procese primero los elementos agregados más recientemente.

Por ejemplo, el usuario abre la tabla y 10 solicitudes se ponen en cola. Descola el primer objeto y comienza a buscar los datos para la primera fila. Sin embargo, el usuario luego se desplaza hacia abajo a las filas 31-40. Luego tendrá que insertar esas filas antes de los primeros 10 en su cola porque ahora son de mayor prioridad. La clave es que no inicie inmediatamente 10 solicitudes a la vez, sino que las procese en orden. De esta forma, cuando el usuario se desplaza, solo "desperdicia" una solicitud, la última solicitud que se realizó.

Una manera fácil de implementar esto realmente es usar [tableView indexPathsForVisibleRows].

+0

Gracias, mis pensamientos son similares. – user1385666

Cuestiones relacionadas