缓存NSData(带UIImages)

时间:2012-07-06 08:08:03

标签: objective-c xcode multithreading uitableview uiimageview

目前,我正在为该网站的客户工作。我有大量的图像需要加载到我的TableView。以下是我目前正在做的事情:

NSDictionary *propertyItems = [self.items objectAtIndex:indexPath.row];
    cell.fio.font = [UIFont boldSystemFontOfSize:17.0f];

    if([propertyItems objectForKey:@"online"] == [NSNumber numberWithInt:1])
        cell.fio.textColor = [UIColor colorWithRed:0.3 green:0.6 blue:0.3 alpha:1.0];

    dispatch_queue_t downloadPhotosQueue = dispatch_queue_create("downloadPhotosQeue", NULL);
    dispatch_async(downloadPhotosQueue, ^{
        NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.pic.image = [UIImage imageWithData:photosData];
        });

    });

    cell.fio.text = [propertyItems objectForKey:@"fio"];

我在 cellForRowAtIndexPath:方法中执行此操作。 一切都在快速加载。但问题是,当我向下滚动桌子时,再次向上,图像会一遍又一遍地重新加载。

问题:有没有办法轻松缓存我从服务器上获取的UIImages?因此,如果它们被加载一次,那么当我运行应用程序时,它们不会一遍又一遍地重新加载。也许我做错了什么?

提前致谢!

4 个答案:

答案 0 :(得分:1)

要从网站加载图片,请使用AFNetworking。它提供了一个从URL加载图像的类:

  

首先添加#import" UIImageView + AFNetworking"到了顶部   控制器或视图实现文件。此类别添加方法   到UIImageView,如:

     

[imageView setImageWithURL:[NSURL URLWithString:@" ..."]];

答案 1 :(得分:1)

我强烈推荐AsyncImageView。我用它,它就像一个魅力。只需设置图片网址,它就可以处理所有内容。

AsyncImageView *imageView = [[AsyncImageView alloc]init];
imageView.imageURL = [NSURL URLWithString:@"https://www.google.es/logos/classicplus.png"];

它将图像缓存在内存中,因此它不会再次从服务器中检索它。它还会在收到内存警告时释放它们。

答案 2 :(得分:1)

我建议this库来完成你想要的。

cellForRowAtIndexPath:

中的

    [cell.imageView setImageWithURL:
    [NSURL URLWithString:[NSString stringWithString:@"www.yourimagepath.path"]]
      placeholderImage:[UIImage imageNamed:@"no_image.jpg"]];

库将为您缓存图像。你也可以设置图像的setHolder,因此在下载图像时看起来不像空白图像。

答案 3 :(得分:0)

问题在于:

NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]];

<强> dataWithContentsOfURL

每次调用函数时(每次滚动时)都会向Url发出请求。 您需要在cellForRowAtIndexPath之前加载所有图片。 就像在ViewDidLoad中一样。 您可以将它们存储在一个数组中,并在cellForRowAtIndexPath中显示您的图片数组。

如果像你说的那样加载真的很快:jsut load picture一旦进入CellForRowAtIndexPath。将它们存储在mutableArray中。并检查图片是否已经存在。