Eliminar la subcapa de la subida de la image de TableViewCell

Cuando tengo una image, inserto la subcapa con CAGradientLayer,

... layer.name = @"Gradient"; [cell.imageView.layer insertSublayer:layer atIndex:0]; 

y cuando no hay image para ImageView, necesito eliminar esta subcapa. Intenté diferentes forms sin éxito. Lo último que probé fue

 for (CALayer *layer in cell.imageView.layer.sublayers) { if ([layer.name isEqualToString:@"Gradient"]) { [layer removeFromSuperlayer]; } } 

pero me da un error:

 CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** Collection <CALayerArray: 0xc1502e0> was mutated while being enumerated. with userInfo (null) 

La exception se produce porque está cambiando el contenido de la matriz de sublayers al enumerarla con el bucle foreach. Esto no es algo especial para las capas, se lanza una exception similar cuando agrega / elimina objects al enumerar cualquier NSMutableArray.

Tienes varias opciones para resolver este problema.

Solución 1: deje de enumerar tan pronto como modifique la matriz.

 for (CALayer *layer in cell.imageView.layer.sublayers) { if ([layer.name isEqualToString:@"Gradient"]) { [layer removeFromSuperlayer]; break; } } 

Solución 2: no enumere la matriz real, en su lugar use su copy.

 NSArray* sublayers = [NSArray arrayWithArray:cell.imageView.layer.sublayers]; for (CALayer *layer in sublayers) { if ([layer.name isEqualToString:@"Gradient"]) { [layer removeFromSuperlayer]; } } 

Solución 3: utilice la encoding del valor key para mantener una reference a la capa de gradiente.

Configurarlo después de insert:

 [cell.imageView.layer insertSublayer:layer atIndex:0]; [cell.imageView.layer setValue:layer forKey:@"GradientLayer"]; 

Recupérelo y elimínelo

 CALayer* layer = [cell.imageView.layer valueForKey:@"GradientLayer"]; [layer removeFromSuperlayer]; [cell.imageView.layer setValue:nil forKey:@"GradientLayer"];