El uso de GCD de iOS para un UITableView

Tengo un UITableView muy intenso que debe optimizarse un poco. La pregunta es, cómo usar la estación central para hacerla de manera efectiva. Cada celda tiene una UIView con un par de tags y dos imágenes. He subclasificado el TableViewCell y las vistas están siendo reutilizadas, aunque todavía es un poco floja cuando la table se hace más grande. ¿Cómo voy a utilizar GCD para optimizar la tabla? ¿O hay una mejor manera de evitarlo? No soy muy fuerte en el event handling hilos y busco algunos consejos.

Aquí está el código a mi tableview:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; JointCAD *currentCall = [[xmlParser calls] objectAtIndex:indexPath.row]; self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"texture3.png"]]; TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.callTypeLabel.text = currentCall.currentCallType; cell.locationLabel.text = currentCall.location; cell.unitsLabel.text = currentCall.units; cell.stationLabel.text = [@"Station: " stringByAppendingString:currentCall.station]; cell.selectedBackgroundView = cell.selectionView; if ([currentCall.callType isEqualToString:@"F"]) { cell.imageType = Fire; } else { cell.imageType = EMS; } if ([currentCall.county isEqualToString:@"W"]) { cell.imageType1 = Washington; } else { cell.imageType1 = Clackamas; } return cell; } 

Aquí está la tablaviewcell subclasificada:

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { callView = [[UIView alloc] initWithFrame:CGRectMake(7.5, 7, 305, 65)]; [callView setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth]; [callView setContentMode:UIViewContentModeTopLeft]; [callView setBackgroundColor: [UIColor colorWithRed:240.0/255.0 green:240.0/255.0 blue:240.0/255.0 alpha:1.0]]; callView.layer.borderWidth = 1.0; callView.layer.borderColor = [UIColor colorWithRed:(0/255.0) green:(0/255.0) blue:(0/255.0) alpha:1.0].CGColor; [self.contentView addSubview:callView]; callTypeLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, 2, 190, 21)]; callTypeLabel.font = [UIFont boldSystemFontOfSize:12.0]; callTypeLabel.textColor = [UIColor blackColor]; callTypeLabel.backgroundColor = [UIColor clearColor]; callTypeLabel.highlightedTextColor = [UIColor whiteColor]; callTypeLabel.adjustsFontSizeToFitWidth = YES; [callView addSubview:callTypeLabel]; locationLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, 17 , 190, 15)]; locationLabel.font = [UIFont systemFontOfSize:10.0]; locationLabel.textColor = [UIColor blackColor]; locationLabel.backgroundColor = [UIColor clearColor]; locationLabel.highlightedTextColor = [UIColor whiteColor]; locationLabel.adjustsFontSizeToFitWidth = YES; [callView addSubview:locationLabel]; unitsLabel = [[UILabel alloc]initWithFrame:CGRectMake(4, 43, 190, 21)]; unitsLabel.font = [UIFont systemFontOfSize:10.0]; unitsLabel.textColor = [UIColor blackColor]; unitsLabel.backgroundColor = [UIColor clearColor]; unitsLabel.highlightedTextColor = [UIColor whiteColor]; unitsLabel.adjustsFontSizeToFitWidth = NO; [callView addSubview:unitsLabel]; stationLabel = [[UILabel alloc]initWithFrame:CGRectMake(195 , 25, 75, 20)]; stationLabel.font = [UIFont systemFontOfSize:12.0]; stationLabel.textColor = [UIColor blackColor]; stationLabel.backgroundColor = [UIColor clearColor]; stationLabel.highlightedTextColor = [UIColor whiteColor]; stationLabel.adjustsFontSizeToFitWidth = YES; [callView addSubview:stationLabel]; CGRect countyImageFrame = CGRectMake(275, 10, 18, 18); UIImageView *countyImageView = [[UIImageView alloc] initWithFrame:countyImageFrame]; countyImageView.image = countyImage; [callView addSubview:countyImageView]; CGRect callTypeImageFrame = CGRectMake(275, 37, 18, 18); UIImageView *callTypeImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; callTypeImageView.image = callTypeImage; [callView addSubview:callTypeImageView]; selectionView = [[UIView alloc] initWithFrame:CGRectMake(10, 7, 200, 65)]; [selectionView setBackgroundColor: [UIColor clearColor]]; } return self; } - (void)setImageType:(CallType)newImageType { imageType = newImageType; if (imageType == Fire) { CGRect callTypeImageFrame = CGRectMake(275, 37, 18, 18); UIImageView *callTypeImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; callTypeImageView.image = [UIImage imageNamed:@"networking.png"]; [callView addSubview:callTypeImageView]; } else if (imageType == EMS) { CGRect callTypeImageFrame = CGRectMake(275, 37, 18, 18); UIImageView *callTypeImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; callTypeImageView.image = [UIImage imageNamed:@"yellow.png"]; [callView addSubview:callTypeImageView]; } } - (void)setImageType1:(County)newImageType1 { imageType1 = newImageType1; if (imageType1 == Washington) { CGRect callTypeImageFrame = CGRectMake(275, 10, 18, 18); UIImageView *countyImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; countyImageView.image = [UIImage imageNamed:@"blue.png"]; [callView addSubview:countyImageView]; } else if (imageType1 == Clackamas) { CGRect callTypeImageFrame = CGRectMake(275, 10, 18, 18); UIImageView *countyImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; countyImageView.image = [UIImage imageNamed:@"green.png"]; [callView addSubview:countyImageView]; } } 

Esto es un poco sutil, pero el área principal en la que se colgará su código es setImageType: method.

Está agregando una Vista de image creada mediante progtwigción en su jerarquía de vista aquí:

 UIImageView *callTypeImageView = [[UIImageView alloc] initWithFrame:callTypeImageFrame]; callTypeImageView.image = [UIImage imageNamed:@"networking.png"]; [callView addSubview:callTypeImageView]; 

Pero en realidad nunca eliminas la vista de la image anterior. Una mejor manera de hacerlo es almacenar en caching la vista de image creada en una propiedad de la celda, luego, cuando configura el tipo de image, envíe el post – [UIVview removeFromSuperview] a la vista de la image anterior antes de crear una nueva.

Como su código se encuentra ahora, cada vez que se deseca una celda, se agrega una nueva vista de image, por lo que cada vez que el usuario se desplaza hacia arriba y hacia abajo en la vista de la tabla, se crea una nueva vista de image y se agrega a la celda. No pasará mucho time hasta que haya docenas de vistas de imágenes en cada celda. Sospecho que esto está causando muchas más llamadas de DrawRect a las vistas de image de lo que realmente es necesario para lograr su propósito.

Una mejor forma de hacerlo sería tener ambos types de vistas de image como properties que cree en el método init de la celda, que solo se configuran en los methods setType. De esta forma, solo crea una vista de image por tipo y simplemente configura su image en el método apropiado de setType. Si lo hace de esta manera, tenga en count que removeFromSuperview lanzará la vista de image, por lo que tendrá que declararla como una propiedad fuerte (suponiendo que esté usando ARC).

Aprecio que ninguna de estas soluciones tiene nada que ver con Grand Central Dispatch, pero es de esperar que eso solucione su problema sin usar un martillo para romper una tuerca :).