2

我正在做这个代码

但是当我滚动 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);
4

2 回答 2

2

我建议不要将以前下载的图像保存在NSMutableDictionary或中,而是使用. 它提供了一个类似的接口(例如有一个方法),但您也可以配置应该缓存多少图像(通过或其他机制)。您可能还想添加一个观察者,以便在内存压力时清空缓存。NSMutableArrayNSCacheNSMutableDictionarysetObject:forKey:countLimitUIApplicationDidReceiveMemoryWarningNotification

如果您想更上一层楼,在下载UITableView或中使用的图像时UICollectionView,我建议您确保 (a) 将可见图像优先于可能已滚出屏幕的图像;(b) 确保限制并发度以避免可能困扰 GCD 全局队列等的超时问题。实现这一点(以及NSCache行为)的最简单方法是使用已建立的异步图像检索UIImageView类别​​之一,例如正如AFNetworkingSDWebImage中包含的那些(或实现您自己的想法变体)。

于 2013-01-26T19:27:29.607 回答
1

您应该将图像存储在 NSArray、NSDictionary 甚至文件系统中。尝试存储在 NSMutableArray 中或保存到磁盘中,而不是仅设置cell.imageView,然后在下次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;
于 2012-09-03T14:51:56.623 回答