gpt4 book ai didi

iphone - Objective C 自定义延迟加载图像 UITableView Cell

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:10:01 25 4
gpt4 key购买 nike

第一次将远程图像加载到 iPhone 应用程序中,希望得到一些帮助来优化该过程。我目前所做的是获取图像(如果不存在)并将其缓存。主要目标是:

  • 仅在需要时加载图像。
  • 保存图像以备将来使用以减少数据消耗,并允许用户在未连接到互联网时拥有一些功能性应用。

我只是觉得我做得不够好。

这是 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;

我应该使用 SQLite 数据库而不是 NSUserDefaults 吗?

我也遇到了异步加载的问题。我觉得它应该看起来像这样:

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]];
});
});

但这显然将错误的图像数据保存到了 NSUserDefault 目的地。

在此方面的任何帮助、对我的编码风格的指导以及任何其他方面的帮助,我们都将不胜感激。

谢谢!

最佳答案

快速浏览一下您的代码 - 您似乎将 block 推送到异步队列中,但您正在调用这些 block 中的 UI 代码。

您应该只在主线程上运行 UI 代码。

至于解决方案 - 查看一些开源实现,让您了解应该做什么,或者直接使用它们。

其中一个是 AsyncImageView在 Github 上。

还有其他一些可以通过快速搜索找到。

关于iphone - Objective C 自定义延迟加载图像 UITableView Cell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9083454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com