Ho notato che le app come Intagram utilizza UICollectionViews
per visualizzare il feed di foto. Ho anche notato che le celle per queste foto sono in qualche modo posizionate sullo schermo prima delle le foto reali vengono scaricate completamente. Quindi, al termine del download, la foto viene visualizzata correttamente nella cella corretta.UICollectionView - Download di immagini ed efficace ricaricamento dei dati, come Instagram
Vorrei copiare questa funzionalità, ma non so come procedere.
Attualmente sto scaricando un gran JSON oggetto trasformo in un array di NSDictionaries. Ogni NSDictionary
contiene informazioni su ciascuna foto e, tra queste informazioni, viene presentato un URL. A questo URL, posso trovare l'immagine corrispondente che ho bisogno di scaricare e visualizzare nel mio UICollectionViewCells
Per ora, io iterare questo elenco e avviare un download per ogni URL che vedo. Al termine del download, ricarico la collectionview utilizzando [self.collectionView reloadData]
. Ma, come puoi immaginare, se ho 30 celle che vogliono tutte un'immagine, ci sono molte chiamate reloadData
.
Sto usando AFNetworking per gestire il download, qui è il metodo, che ho chiamata in base l'URL ho detto prima:
-(void) downloadFeedImages:(NSString *) photoURL imageDescs:(NSDictionary*)imageDescs photoId:(NSString *)photoID{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString* foofile = [directory stringByAppendingPathComponent:photoID];
if([[NSFileManager defaultManager] fileExistsAtPath:foofile]){
// IF IMAGE IS CACHED
[self.collectionView reloadData];
return;
}
NSLog(@"photoURL: %@", photoURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photoURL]];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// Save Image
NSLog(@"URL-RESPONSE:%@", image);
NSString *myFile = [directory stringByAppendingPathComponent:photoID];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:myFile atomically: YES];
[self.collectionView reloadData];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"ERROR: %@", [error localizedDescription]);
}];
[[WebAPI sharedInstance] enqueueHTTPRequestOperation:operation];
}
Quindi fondamentalmente, mi chiedo come posso ottenere la funzionalità che Instagram e applicazioni simili hanno quando si tratta di visualizzare un feed con immagini. Inoltre, vorrei sapere un buon modo per avviare un download per ogni cella, e quando questo download è terminato, aggiornare quella cella, senza ridisegnare l'intera vista con [reloadData]
Grazie
Tuttavia, quando implemento questo, il CollectionView è abbastanza hacky durante lo scorrimento. questo metodo è completamente asincrono? Qualche idea su come rendere lo scorrimento della mia collezione meno hacky? =) – Eyeball
@Eyeball Sì, questo è completamente asincrono. Ci sono altre operazioni che stai eseguendo come FileIO in 'cellForItemAtIndexPath'? Qualsiasi operazione che causerebbe una pausa notevole nel thread principale? – Amar
Un'altra cosa, non è necessario ricaricare la raccolta per ogni immagine ora. Il codice AFNetworking si occupa di aggiornare la vista dell'immagine una volta che l'immagine è stata scaricata e assegnata ad essa. – Amar