我知道这已经被问过很多次了,但请耐心等待,因为我已经尝试了几天来寻找解决方案。
我有一个 rss 解析器,一个表视图,其中:文本、详细信息和图像设置为 AccessoryDisclosureIndicator.view。
图像通过简单的 GCD 异步加载很好:快速滚动数百个结果。如果我有良好的连接,没有延迟,没有错误。
问题是,一瞬间 - 它们在加载时闪烁,因为单元正在被重复使用。此外,如果连接不佳,有时会留下散乱的图像,但文本/细节是正确的,只有图像是旧的......所以让我重复一遍,文本/细节更新很好,永远不会重新排队错误,只是图像有时很少会在连接不良/快速来回滚动时出现错误排队。
我的问题,有人可以帮我缓存/标记 cell.accs.views 吗?我尝试设置 cellID,但在实现时遇到了问题。如果连接永远不会变慢,我的下面的代码效果很好,只是在重新排队一个我不介意的单元格时有轻微的闪烁。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
[cell.textLabel setNumberOfLines:3];
cell.textLabel.font = [UIFont boldSystemFontOfSize:14.0];
[cell.detailTextLabel setNumberOfLines:3];
cell.detailTextLabel.font = [UIFont systemFontOfSize:12.0];
cell.detailTextLabel.textColor = [UIColor blackColor];
}
RSSItem * rssItem = (RSSItem *)(_rssParser.rssItems)[indexPath.row];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
//This is what you will load lazily
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:rssItem.imageURL]];
dispatch_sync(dispatch_get_main_queue(), ^{
UIImageView *accImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data ]];
[accImageView setFrame:CGRectMake(0, 0, accImageView.image.size.width, 92)];
cell.accessoryView = accImageView;
//[cell setNeedsLayout];//not needed
});
});
[cell.textLabel setText:rssItem.title];
[cell.detailTextLabel setText:rssItem.summary];
return cell;}