带有从iphone中的服务器加载的图像的表视图

时间:2014-12-26 04:39:03

标签: objective-c iphone uitableview uiimageview

您好我正在开发IOS应用程序。我的应用程序包含表格视图,图像作为我的表格的一部分。我从服务器加载我的图像。它工作正常。但我的表视图的问题是,一旦我滚动我的表视图,它就开始闪烁我的图像。这意味着它显示错误的图像一段时间后显示正确的图像。滚动时,此行为会继续。是否需要显式调用任何对象为nil或释放一些单元格对象或持有一些单元格对象。我的表视图单元格如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *simpleTableIdentifier = @"MediaContentCell";

MediaContentCell *cell = (MediaContentCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    cell = (MediaContentCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

VideoDataModel *videoData = [_mediaContentArray objectAtIndex:indexPath.row];

cell.mediaTitle.text = videoData.title;
cell.mediaSubtitle.text = videoData.shortdescription;

NSMutableArray *posters = videoData.poster;

dispatch_queue_t myQueue = dispatch_queue_create("ImageQue",NULL);
dispatch_async(myQueue, ^
{
    UIImage *image;
    if(!posters)
    {
        image = [UIImage imageNamed:@"dummyprog_large1.png"];
    }
    else
    {
        for(int index = 0 ; index < posters.count; index++)
        {
            PosterDataModel *posterData = [posters objectAtIndex:index];
            if([posterData.postertype isEqualToString:POSTER_TYPE_LANDSCAPE])
            {
                 image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:posterData.posterurl]]];
                break;
            }
        }
    }

    dispatch_async(dispatch_get_main_queue(), ^
    {
        cell.mediaPicture.image = image;
    });
});

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

return cell;
}

有没有人可以帮我这个?需要一些帮助谢谢。

3 个答案:

答案 0 :(得分:3)

使用 - SDWebImage

     [cell.imageView sd_cancelCurrentImageLoad];
     [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                       placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

我正在使用这个框架,它对我来说很好。

答案 1 :(得分:1)

cell.imageView.image = [UIImage imageWithData:yourDefaultImgUrl];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData *imageData = [NSData dataWithContentsOfURL:yourServerImageUrl];      
        if (imageData){
            dispatch_async(dispatch_get_main_queue(), ^{
                 UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];          
                 if (updateCell)
                updateCell.imageView.image = [UIImage imageWithData:imageData];
            });
        }
    });

它可以帮助你:)

答案 2 :(得分:0)

导致问题的重用机制

假设,如果您的表视图有1000个单元格要显示,并且屏幕上一次可以看到5个单元格,iOS将只在内存中创建6个UITableViewCell对象。

在您的代码中,图像将从网络异步加载,然后设置为索引路径上属于单元格的[mediaPicture],但是当您滚动表视图时,由于重用机制,[ cell.mediaPicture]可能与索引路径不正确相关,并且将错误地设置下载的图像。

您可以查看有关重用机制的问题:

UITableViewCell - Understanding "reuseable"

Amol的答案正是您案件的解决方案。