UIActivityIndicator en una celda UICollectionView aleatoriamente no se ocultará

Tengo un UICollectionView donde se muestra un UIActivityIndicator en la celda antes de cargar una image, que luego se descarta independientemente del éxito o falla en el bloque UIImageView + AFNetworking. Sin embargo, a veces obtengo indicadores de actividad sobrantes que no parecen ocultar o dejar de animar.

Esto es parte de mi cellForItemAtIndexPath:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { ... NSURL *imageURL = [NSURL URLWithString:[tmpcamera objectForKey:@"url"]]; NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10]; UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; activityIndicator.hidesWhenStopped = YES; activityIndicator.hidden = NO; activityIndicator.frame = CGRectMake(0, 0, 130, 110); activityIndicator.tag = 10; [cell.imageView addSubview:activityIndicator]; [activityIndicator startAnimating]; __weak typeof(FavouriteCell) *weakImage = cell; [cell.imageView setImageWithURLRequest:imageRequest placeholderImage:[UIImage imageNamed:@"trans50.png"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *i) { [activityIndicator stopAnimating]; activityIndicator.hidden = YES; [activityIndicator removeFromSuperview]; [weakImage.imageView setImage:i]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { [activityIndicator stopAnimating]; activityIndicator.hidden = YES; [activityIndicator removeFromSuperview]; [weakImage.imageView setImage:[UIImage imageNamed:@"errorimage.png"]]; }]; ... } 

No estoy seguro si este código es suficiente para depurar cuál es el problema, pero cualquier idea sería apreciada.

Una muestra de captura de pantalla de lo que estoy hablando es aquí:

muestra

Como sus células pueden reciclarse o reutilizarse antes de que la request de image tenga éxito o no (por ejemplo, mediante el desplazamiento), puede terminar con un indicador de actividad "huérfano" en una celda.

Secuencia de events:

  1. Se carga una celda, se intenta cargar la image y se inicia el indicador de actividad
  2. El usuario se desplaza antes de cargar la image. La celda se recicla.
  3. La celda se reutiliza. Se agrega un nuevo indicador de actividad y se cancela la carga previa de la image (por lo que nunca se llama a los bloques de éxito / falla previos). Los indicadores de actividad antiguos y nuevos ahora están en la celda, con el antiguo todavía en ejecución.

Algunas sugerencias para evitar este problema:

  1. Cree una celda personalizada que incluya el indicador de actividad.
  2. Al crear el indicador de actividad, asigne un número a la propiedad de label del indicador, luego busque para ver si ya hay un indicador de actividad a través de viewWithTag: al reutilizar una celda. Si ya existe, use el existente, de lo contrario, cree uno nuevo.