Problema de performance de AVAssetImageGenerator

Estoy intentando crear una galería de videos.

Para mostrar videos, estoy usando una UICollectionView . Cada UICollectionViewCell tiene un background con una miniatura de video. Para generar una miniatura de video estoy usando un método con lógica:

 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generator.appliesPrefernetworkingTrackTransform = YES; CMTime time = CMTimeMakeWithSeconds(0,15); AVAssetImageGeneratorCompletionHandler handler = ^(CMTime timeRequested, CGImageRef image, CMTime timeActual, AVAssetImageGeneratorResult result, NSError *error) { NSLog(@"handler^()"); if (result == AVAssetImageGeneratorSucceeded) { thumbnail = [UIImage imageWithCGImage: image]; success(thumbnail); } else { failure(error); } }; CGSize maximumSize = CGSizeMake(CLIPBOARD_COLLECTION_VIEW_CELL_WIDTH, CLIPBOARD_COLLECTION_VIEW_CELL_HEIGHT); generator.maximumSize = maximumSize; NSLog(@"generateCGImagesAsynchronouslyForTimes:"); [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler]; 

Me he dado count de que generateCGImagesAsynchronouslyForTimes no funciona de forma totalmente asíncrona. Hay un espacio de time entre llamadas de este método. Esto causa un gran retraso mientras estoy cargando celdas de vista de tabla. Si comento línea [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler] entonces no hay ningún retraso visible (ni imágenes).

¿Cómo puedo resolver este problema de performance?

No se AVAssetImageGeneratorCompletionHandler bloque AVAssetImageGeneratorCompletionHandler se AVAssetImageGeneratorCompletionHandler en el hilo principal:

Progtwigción simultánea con AV Foundation

No se garantiza que las llamadas de AV Foundation-invocaciones de bloques, observadores de valores key y controlleres de notifications se realicen en un hilo o queue en particular. En su lugar, AV Foundation invoca estos controlleres en subprocesss o queues en las que realiza sus tareas internas. Usted es responsable de probar si el hilo o la queue en la que se invoca un controller es apropiado para las tareas que desea realizar. Si no es así (por ejemplo, si desea actualizar la interfaz de usuario y la llamada no está en el hilo principal), debe networkingirigir la ejecución de sus tareas a un hilo o queue seguro que reconoce o que crea para la propósito.

¿El success y el failure llamada con dispatch_async solucionan el problema?

 dispatch_async(dispatch_get_main_queue(), ^{ if (success) { success(); } )}; 

Hay un par de maneras de networkingirigir la request de generación de imágenes asíncronas a otra cadena, una de ellas es la encapsulación de la function dentro de una NSBlockOperation agregada a una NSOperationQueue con su queue subyacente establecida en lo que es más apropiado para su aplicación.

La queue más apropiada debería ser relativamente fácil de adivinar, si no la conoces, ya que solo hay algunas opciones allí.