Objective C Imagens de carregamento lento preguiçoso UITableView Cell
Primeira vez que carrega imagens remotas em um aplicativo para iPhone e gostaria de ajuda para otimizar o processo. O que eu fiz atualmente é obter a imagem se ela não existir e armazená-la em cache. Os principais objetivos são:
penas carregue imagens quando necessárialvar imagens para uso futuro para reduzir o consumo de dados e permitir que o usuário tenha um aplicativo um pouco funcional quando não estiver conectado à InterneSó acho que não estou fazendo o suficient
Aqui está um trecho de código em 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;
Devo usar um banco de dados SQLite em vez de NSUserDefault
Também estou tendo problemas com o carregamento assíncrono. Eu sinto que deveria ficar assim:
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]];
});
});
Mas isso obviamente salva os dados de imagem incorretos no destino NSUserDefaul
Qualquer ajuda sobre isso, dicas sobre o meu estilo de codificação e qualquer outra coisa é muito apreciad
Obrigado