我在做这个代码
但是当我滚动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);
答案 0 :(得分:2)
我建议使用NSCache
,而不是将以前下载的图片保存在NSMutableDictionary
或NSMutableArray
中。它提供了与NSMutableDictionary
类似的界面(例如,具有setObject:forKey:
方法),但您也可以配置应缓存的图像数量(通过countLimit
或其他机制)。您可能还想为UIApplicationDidReceiveMemoryWarningNotification
添加一个观察者,以便在内存压力下清空缓存。
如果您想将其提升到新的水平,在下载UITableView
或UICollectionView
中使用的图片时,我建议您确保(a)将可见图像优先于可能已滚动的图像屏幕外; (b)确保限制并发度以避免可能困扰GCD全局队列的超时问题等。实现该问题的最简单方法(以及NSCache
行为)是使用已建立的异步之一图像检索UIImageView
类别,例如AFNetworking或SDWebImage中包含的类别(或实现您自己的想法变体)。
答案 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;