如何在UITableView中高效加载图像?

时间:2014-01-03 03:10:38

标签: ios objective-c uitableview uiimageview parse-platform

我有UITableView,其中包含大量图片。

每个单元格将有5个图像,这些图像是从Parse.com随机加载的。

我的查询代码现在位于cellForRowAtIndexPath

这会导致一些问题:

1。)滚动表格时有一些延迟/延迟。

2。)由于某些奇怪的原因,图像没有显示在正确的位置。

3。)每次滚动表格时,图像都会重新加载/更改。

我希望图像能够被加载"只需一次在UIView上,在正确的位置,并顺利滚动。

处理此问题的最佳方式是什么?

以下是我如何加载图片的代码:

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

    // set up the cell here

    // query and display random images from parse.com
    PFQuery * query = [PFUser query];
    [query whereKey:@"category" equalTo:self.cell.label.text];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if (error)
        {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
        else
        {
            for (int i = 0; i < objects.count; i++)
            {
                self.profilePicObject = [objects objectAtIndex:i];

                int imgRandom = arc4random() % [objects count];

                self.randomProfilePicObject = [objects objectAtIndex:imgRandom];

                self.imageFile = [self.randomProfilePicObject objectForKey:@"imageFile"];
                NSURL * imageFileURL = [[NSURL alloc] initWithString:self.imageFile.url];
                NSData * imageData = [NSData dataWithContentsOfURL:imageFileURL];
                UIImage * aImage = [[UIImage alloc] initWithData:imageData];

                self.cell.profilePicOne.image = aImage;
            }
    }

    return self.cell;

}

编辑:

我正在使用SDWebImage,现在表格滚动顺畅,图像正在显示。

新问题:

图片正在加载错误的单元格。

我查询表并将标签文本与Parse表中的正确字符串相匹配,并使用它来显示正确的图像。

最初,某些图像会加载到正确的单元格中,而有些图像则不会加载。

滚动时,图像遍布整个地方。

解决此问题的最佳方法是什么?

以下是我设置单元格的方法:

static NSString * cellIdentifier = @"FilterSelectCell";

self.cell = (FilterSelectCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (self.cell == nil)
    {
        NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"FilterSelectCell" owner:self options:nil];
        self.cell = [nib objectAtIndex:0];

        self.cell.profilePicOne.clipsToBounds = YES;
        self.cell.profilePicOne.layer.cornerRadius = 20.0;

        self.cell.profilePicTwo.clipsToBounds = YES;
        self.cell.profilePicTwo.layer.cornerRadius = 20.0;

        self.cell.profilePicThree.clipsToBounds = YES;
        self.cell.profilePicThree.layer.cornerRadius = 20.0;

        self.cell.profilePicFour.clipsToBounds = YES;
        self.cell.profilePicFour.layer.cornerRadius = 20.0;

        self.cell.profilePicFive.clipsToBounds = YES;
        self.cell.profilePicFive.layer.cornerRadius = 20.0;
    }

    self.cell.label.text = [self.myArray objectAtIndex:indexPath.row];

4 个答案:

答案 0 :(得分:1)

最佳解决方案是使用图像缓存系统(如SDWebImage)来防止对同一图像进行重复的Web查询。它非常易于使用,并允许您在从URL下载图像数据时使用占位符加载图像。它还异步加载图像,因此您的UI不会被阻止,它会在应用程序重载之前从缓存中释放图像。你只需加载这样的图像,SDWebImage就可以了:

[self.cell.profilePicOne setImageWithURL:imageFileURL placeholderImage:[UIImage imageNamed:@"LOADING_IMAGE.png"]];

SDWebImage Repository

答案 1 :(得分:0)

延迟加载是更好的解决方案,请看下面的讨论 Lazy loading UITableView with multiple images in each cell

答案 2 :(得分:0)

使用具有UIImageView类别的缓存支持的异步图像下载器。我已经使用了很长时间。确定你的问题可能会被这个问题克服SDWebImage

答案 3 :(得分:0)

您可以结帐此实用程序APSmartStorage。 它支持下载,内存和磁盘缓存。