0

I tried to build a table view with help of coredata and FetchedResultsController (info from coredata is take it with an API from a server), each cell from table has a image view which load images from net asynchronous with GCD (also I tried and with SDWebImage) in method
"tableView:tableView cellForRowAtIndexPath:indexPath", the problem appear when I make another request for more records (for example first time I have 50 records, and when I do a new request and save it in core data the images are no more correct associated with article or disappear on scrolling) I believe because the results from fetchedResultsController are sorted in function of time. My code:

NewsFeed *singleFeed = [self.fetchedResultsController objectAtIndexPath:indexPath];
NLNewsFeedCell *cell = (NLNewsFeedCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NewsFeedCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
    cell.lblTextContain.numberOfLines = 0;
}
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^(void) {
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:singleFeed.urlPicture]];

        UIImage* image = [[UIImage alloc] initWithData:imageData];
        if (image) {
            dispatch_async(dispatch_get_main_queue(), ^{
                cell.imgPicture.image = image;
                [cell setNeedsLayout];
            });
        }
    });                               

}

Any suggestion, how can solve this problem? Thanks and sorry for misspelling.

4

2 回答 2

1

在没有看到其余代码的情况下,我注意到如果在经典cellForRowAtINdexPath.

每次显示单元格时,您总是从网上下载图像,这可能会发生多次,具体取决于您向上和向下滚动 UITableView 的次数。如果您没有实现任何 URLCache,这可能会导致不必要的网络操作,或者最糟糕的是,如果服务器以无缓存响应。您应该构建一种本地下载器,它只异步加载一次图像并存储在缓存中,并阻止对同一资源的任何后续请求。

关于你的问题,不要忘记细胞被重复使用。这意味着 UITableCell 被创建并再次用新数据重新填充。prepareForReuse我发现在我的自定义类单元中实现以清理为以前的实体继承的任何资源非常有用。否则,除非下载完成并替换图像,否则您将看到旧图像。

于 2013-10-03T13:53:21.000 回答
1

首先,检查重复使用的单元格:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

如果单元格是nil,则创建一个新单元格。如果不nil使用现有的。

其次,我建议您创建一个自定义单元来处理图像的下载,并可能取消下载或忽略下载。

您的问题是由于在加载单元格后完成下载,并且可能已经完成了不再可见的单元格的下载。

您可以使用AFNetworking或任何其他支持下载取消的异步图像加载库,并且在自定义单元格的-(void)prepareForReuse方法(在重新使用单元格之前调用)中,您可以取消旧的下载操作,以便在加载单元格时它将使用来自最后一次下载操作。

于 2013-10-03T13:52:32.433 回答