Vista de colección Loader de círculo celular que afecta múltiples celdas y parpadeo

Tengo una vista que esencialmente es una biblioteca de libros y he estado tratando de agregar una animation de carga circular a los libros para que el usuario pueda ver el progreso de la descarga a medida que seleccionan nuevos libros. El problema con el que me estoy topando es que la animation de carga funciona bien cuando está en la celda en indexPath 0-0, pero cuando está en cualquier otra ruta de índice, la animation parpadeará y aparecerá momentáneamente en otras celdas.

En esta image a continuación, estoy descargando japonés, pero el cargador parpadea temporalmente en albanés, armenio, cebuano y varios otros libros no capturados en el momento de esta captura de pantalla. Debido a que el cargador japonés también está parpadeando, el instante en que tomé la captura de pantalla no mostró el cargador japonés en absoluto.

Error

Después de algunas depuraciones, he descubierto que es muy probable que esto ocurra porque cada vez que se vuelve a cargar la vista, las células se vuelven a usar y, por alguna razón, el order de las celdas se cicla. He intentado anular el prepareForReuse en la celda personalizada y restablecer la configuration a oculta, pero sigo recibiendo el fantasma de progreso por una fracción de segundo que está causando el parpadeo.

Mi código para hacer el indicador de progreso es bastante básico. A continuación se muestra mi function de configuration que crea la barra de progreso en la initialization de la celda

 func setupProgressCircle(){ progressCircle = CAShapeLayer(); let centerPoint = CGPoint (x: bookView.bounds.width / 2, y: bookView.bounds.height / 2); let circleRadius : CGFloat = bookView.bounds.width / 2 * 0.5; var circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(-0.5 * M_PI), endAngle: CGFloat(1.5 * M_PI), clockwise: true ); progressCircle = CAShapeLayer (); progressCircle!.path = circlePath.CGPath; progressCircle!.strokeColor = UIColor.whiteColor().CGColor; progressCircle!.fillColor = UIColor.clearColor().CGColor; progressCircle!.lineWidth = 5; progressCircle!.strokeStart = 0; progressCircle!.strokeEnd = 0 overlayView.layer.addSublayer(progressCircle); } 

Llamo a la siguiente function desde cellForRowAtIndexPath a medida que la descarga progresa para incrementar el progreso.

 func setProgress(progress: CGFloat){ progressCircle?.strokeEnd = progress } 

Desde entonces, agregué la siguiente function para que cuando las células se reutilicen o se reorderen, el progreso regresará a cero por defecto y sin indicador.

 override func prepareForReuse() { if progressCircle != nil{ progressCircle?.hidden = true progressCircle!.strokeEnd = 0 } } 

Desafortunadamente, nada de lo que he intentado ya ha solucionado este problema. Actualmente estoy llamando a collectionView.reloadData() cada vez que obtengo una actualización de progreso en un libro y me pregunto si eso podría ser una parte del problema.

Estoy abierto a la refactorización, no soy un experto y podría estar abordando el problema mal. Estoy abierto a sugerencias y puedo elaborarlas según sea necesario. ¡Gracias!

ACTUALIZAR

Según lo solicitado, aquí hay una versión condensada de my cellForRowAtIndexPath

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! LanguageBookCell var book = controller.objectAtIndexPath(indexPath) as! BookData ...Cell Text/Image/Config... if(book.active == false){ cell.overlayView!.alpha = 0.7 cell.dlLabel.hidden = false cell.dlLabel.text = "Tap to Download" cell.progressCircle.hidden = true }else if(book.status == "Loading"){ cell.progressCircle.hidden = false cell.setProgress(percentLoaded) } ... Other Cell Configs... return cell } 

Según lo solicitado, publiqué la mejor solución que pude encontrar.

Nunca pude averiguar cómo obligar a las células a no reorderarse, independientemente de lo que intenté, cada vez que se reloadData() , las células se reorderaban a sí mismas.

Sin embargo, pude evitar que mis células parpadeen cuando me di count de que otras properties también se movían, como los títulos.

Al final, me di count de que solo estaba volviendo a calcular el progreso en la celda que cambió, por lo que cuando las celdas migrarían alnetworkingedor no se reiniciarían las properties correctas. Al restablecer siempre la configuration de la celda a lo que debería ser el valor pnetworkingeterminado dentro de mi cellForRowAtIndexPath , pude deshacer el parpadeo.

Para aquellos que tienen problemas similares, mi mejor consejo sería verificar sus instrucciones de lógica para asegurarse de que no haya un agujero en su código en el que, si las células se reasignan, la configuration no se restaurará correctamente. ¡Buena suerte a todos!