Objective C Custom Lazy Load Images UITableView Cell
Primera vez cargando imágenes remotas en una aplicación de iPhone, y quisiera ayuda para optimizar el proceso. Lo que he hecho actualmente es obtener la imagen si no existe y guardarla en caché. Los objetivos principales son:
solo cargue imágenes cuando sea necesario. guardar imágenes para uso futuro para reducir el consumo de datos y permitir que el usuario tenga una aplicación algo funcional cuando no esté conectado a Internet.Simplemente no creo que lo esté haciendo lo suficientemente bien.
Aquí hay un fragmento del código dentro de tableView: cellForRowAtIndexPath:
MVImageCell * cell = (MVImageCell *)[tableView dequeueReusableCellWithIdentifier:@"PicsAndVideosCell"];
// empty cell
cell.imageView.image = nil;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
// set cell properties
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 2;
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.imageView.frame = CGRectMake(15, 6, 58, 58);
cell.imageView.layer.cornerRadius = 6;
cell.imageView.layer.masksToBounds = YES;
Photoset * sfc = [self.myarray objectAtIndex:indexPath.row];
cell.cid = sfc.sfcid;
cell.ctitle = sfc.title;
cell.cimg = sfc.cover;
cell.textLabel.text = sfc.title;
cell.detailTextLabel.text = sfc.date;
// set cell image
MVImage * thumb = [[MVImage alloc] init];
NSString * retina = ([[MVProject sharedInstance] settings_retina]) ? @"2" : @"";
if ([NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"Settings_SFCCovers%@_%@", retina, cell.cid]]]) {
thumb = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"Settings_SFCCovers%@_%@", retina, cell.cid]]];
[cell.imageView setImage:[MVImage imageWithImage:[[UIImage alloc] initWithData:thumb.data] covertToWidth:58.0f covertToHeight:58.0f]];
[cell bringSubviewToFront:[cell.imageView superview]];
} else {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
thumb.data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", cell.cimg]]];
thumb.title = cell.ctitle;
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:thumb] forKey:[NSString stringWithFormat:@"Settings_SFCCovers%@_%@", retina, cell.cid]];
[cell.imageView setImage:[MVImage imageWithImage:[[UIImage alloc] initWithData:thumb.data] covertToWidth:58.0f covertToHeight:58.0f]];
[cell bringSubviewToFront:[cell.imageView superview]];
});
});
}
return cell;
Debo usar una base de datos SQLite en lugar de NSUserDefaults?
También tengo problemas con la carga asincrónica. Siento que se supone que debe verse así:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
thumb.data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", cell.cimg]]];
thumb.title = cell.ctitle;
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:thumb] forKey:[NSString stringWithFormat:@"Settings_SFCCovers%@_%@", retina, cell.cid]];
dispatch_sync(dispatch_get_main_queue(), ^{
[cell.imageView setImage:[MVImage imageWithImage:[[UIImage alloc] initWithData:thumb.data] covertToWidth:58.0f covertToHeight:58.0f]];
[cell bringSubviewToFront:[cell.imageView superview]];
});
});
Pero eso obviamente guarda los datos de imagen incorrectos en el destino NSUserDefault.
Cualquier ayuda en esto, consejos sobre mi estilo de codificación, y cualquier otra cosa es muy apreciada.
¡Gracias