在iphone中滚动uitableview时隐藏的图像

时间:2012-09-03 14:21:55

标签: iphone grand-central-dispatch

我在做这个代码

但是当我滚动uitableview图像时,我想要的图像一旦加载就会消失,那么它就不会消失。

请告诉我该怎么做。

__block NSData *image = nil;
dispatch_queue_t imageQueue = dispatch_queue_create("queueForCellImage", NULL);
dispatch_async(imageQueue, ^{
    NSString *thumbnailURL = @"http://www.bizfy.com/demo/biscoot/a1.png";
    image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:thumbnailURL]];
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image = [UIImage imageWithData:image];
        [cell setNeedsLayout];
    });
});
dispatch_release(imageQueue);

2 个答案:

答案 0 :(得分:2)

我建议使用NSCache,而不是将以前下载的图片保存在NSMutableDictionaryNSMutableArray中。它提供了与NSMutableDictionary类似的界面(例如,具有setObject:forKey:方法),但您也可以配置应缓存的图像数量(通过countLimit或其他机制)。您可能还想为UIApplicationDidReceiveMemoryWarningNotification添加一个观察者,以便在内存压力下清空缓存。

如果您想将其提升到新的水平,在下载UITableViewUICollectionView中使用的图片时,我建议您确保(a)将可见图像优先于可能已滚动的图像屏幕外; (b)确保限制并发度以避免可能困扰GCD全局队列的超时问题等。实现该问题的最简单方法(以及NSCache行为)是使用已建立的异步之一图像检索UIImageView类别,例如AFNetworkingSDWebImage中包含的类别(或实现您自己的想法变体)。

答案 1 :(得分:1)

您应该将图像存储在NSArray,NSDictionary甚至文件系统中。不要只设置cell.imageView,而是尝试存储在NSMutableArray中或保存到磁盘,并在下次调用cellForRowAtIndexPath时,访问存储它的图像。

使用NSMutableDictionary解决方案的一些代码,假设您正在使用ARC(尝试理解):

在您的界面文件中,您声明了NSMutableDictionary *dictionaryImages;

在您的实施文件中,使用viewDidLoad方法dictionaryImages = [NSMutableDictionaryImages dictionary];

启动它

现在,在您下载图片的地方,您还应该将图像插入字典中(我不会发布您的所有代码,只发布该部分的相关部分)

NSString *thumbnailURL = @"http://www.bizfy.com/demo/biscoot/a1.png";
UIImage *imageForDictionary = [UIImage imageWithData:image];
[dictionaryImages setObject:imageForDictionary forKey:thumbnailURL];

然后,当调用cellForRowAtIndexPath时,您将其与图像相关联(当然,如果您有权访问thumbnailURL):

NSString *thumbnailURL = **get it from somewhere**;
UIImage *imageFromDictionary = [dictionaryImages objectForKey:thumbnailURL];
cell.imageView.image = imageFromDictionary;