Sto lavorando a un'attività (solo iOS5 +) che comporta il download di migliaia di immagini dal server. Le immagini appartengono a determinate categorie e ogni categoria può avere centinaia di immagini. Quello che devo fare è questo: -AFNetworking + NsOperationQueue - Download di migliaia di immagini
1) Assicurarsi che l'app scarichi eventuali immagini mancanti in background se l'app è attiva (anche quando l'utente sta navigando in altre aree dell'app che non sono correlate alle foto) .
2) Quando l'utente fa clic su una categoria di foto, le immagini di quella categoria devono essere scaricate come priorità elevata poiché sono quelle che devono essere immediatamente visibili.
Tutto ciò succede solo se l'immagine non è già disponibile offline. Una volta scaricato, l'immagine verrà utilizzata dalla memoria locale.
Per risolvere questo problema, la logica che sto usando è questo: -
1) In AppDelegate.m, in applicationDidBecomeActive
, comincio downlading eventuali immagini mancanti. Per fare questo, faccio una query di Core Data, scopro quali sono le immagini mancanti e inizio a scaricarle in una discussione con priorità BACKGROUND. Qualcosa di simile a questo: -
dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(imageDownloadQueue, ^{
[DataDownloader downloadMissingImages];
});
dispatch_release(imageDownloadQueue);
Il codice downloadMissingImages
assomiglia a questo: -
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];
}
Questo funziona, ma blocca il l'applicazione si blocca dopo un po 'utente principale e. Questo è quando cerco di scaricare circa 700 immagini. Con più immagini, sarebbe sicuramente in crash.
2) Quando un utente fa clic su una categoria, ho bisogno di scaricare quelle immagini per prime perché devono essere mostrate all'utente immediatamente. Non sono sicuro di come posso interrompere la chiamata missingImages e dirgli di iniziare a scaricare determinate immagini prima di altre.
Quindi, in sostanza, ho bisogno di scaricare tutte le immagini mancanti sullo sfondo, ma se l'utente sta navigando in una categoria di foto, quelle immagini devono avere la massima priorità nella coda di download.
Non riesco a capire come farlo funzionare in modo efficiente. qualche idea?
logil crollo simile a questa
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)
Grazie in anticipo.
Ciao Sergio, hai qualche esempio di codice per dimostrare download Chunked come suggerisce? –
anche , come posso verificare se una coda con priorità più alta ha già scaricato un ce ottieni l'immagine? Qualche esempio di codice per questo? –
Ho modificato la domanda per includere i registri degli arresti anomali - I thumbnails generati da ogni download di immagini .. quindi immagino che 700 immagini causino sicuramente la perdita di memoria qui .. –