Estoy trabajando en una tarea (iOS5 + solamente) que implica la descarga de miles de imágenes desde el servidor. Las imágenes pertenecen a ciertas categorías y cada categoría puede tener cientos de imágenes. Lo que necesito hacer es esto: -AFNetworking + NsOperationQueue - Descargar miles de imágenes
1) Asegúrese de que la aplicación descarga las imágenes que faltan en el fondo si la aplicación está activa (incluso cuando el usuario está navegando en otras áreas de la aplicación que no están relacionadas con las fotos) .
2) Cuando el usuario hace clic en una categoría de fotografía, las imágenes en esa categoría se deben descargar como alta prioridad porque esas son las que deben ser visibles inmediatamente.
Todo lo anterior ocurre solo si la imagen no está disponible sin conexión. Una vez que se haya descargado, la imagen se usará desde el almacenamiento local.
Para solucionar esto, la lógica que uso es la siguiente: -
1) En AppDelegate.m, en applicationDidBecomeActive
, comienzo downlading alguna de las imágenes que faltan. Para hacer esto, realizo una consulta de Datos centrales, descubro qué imágenes faltan y comienzo a descargarlas en un subproceso con prioridad de FONDO. Algo como esto: -
dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(imageDownloadQueue, ^{
[DataDownloader downloadMissingImages];
});
dispatch_release(imageDownloadQueue);
El código downloadMissingImages
se ve así: -
NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];
downloadQueue.maxConcurrentOperationCount = 20;
for(MyImage *img in matches)
{
NSURLRequest *request = [NSURLRequest requestWithURL:img.photoUrl];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request success:^(UIImage *image) {
[MyImage imageFromAPI:image inManagedObjectContext:document.managedObjectContext];
NSLog(@"Successfully downloaded image for %@", img.title);
}];
[downloadQueue addOperation:operation];
}
Esto funciona, pero bloquea la interfaz de usuario principal y la aplicación se bloquea después de un tiempo. Esto es cuando intento descargar aproximadamente 700 imágenes. Con más imágenes, ciertamente se bloqueará.
2) Cuando un usuario hace clic en una categoría, necesito descargar esas imágenes primero, ya que deben mostrarse al usuario de inmediato. No estoy seguro de cómo puedo interrumpir la llamada a las imágenes que faltan y decirle que comience a descargar ciertas imágenes antes que los demás.
Así que, básicamente, necesito descargar todas las imágenes que faltan en el fondo, pero si el usuario está navegando categoría de la foto, esas imágenes deben tener alta prioridad en la cola de descarga.
No entiendo cómo hacer que esto funcione de manera eficiente. ¿Alguna idea?
registrosEl choque se ven así
PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Jun 24 11:39:45 MacBook-Pro.local PAPP[36373] <Error>: ImageIO: JPEG Insufficient memory (case 4)
Gracias de antemano.
Hola Sergio, ¿tienes cualquier código de ejemplo para demostrar descargas fragmentada como usted sugiere? –
también , ¿cómo puedo verificar si una cola de mayor prioridad ya descargó una ce ¿alguna imagen? ¿Algún código de muestras para eso? –
He modificado la pregunta para incluir registros de fallos: genero miniaturas de cada descarga de imagen ... así que creo que 700 imágenes definitivamente están causando la pérdida de memoria aquí ... –