在搜索这个答案两天后,我找到了解决方案。
我找到了Duncan C解释的解决方案:
如何实施:
- (void)viewDidLoad
{
(...)
dispatch_queue_t mainQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
imagesDictionary = [[NSMutableDictionary alloc] init];
(...)
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
(...)
NSData *imageData = [imagesDictionary objectForKey:@"IMAGE URL"];
if (imageData)
{
UIImage* image = [[UIImage alloc] initWithData:imageData];
imageFlag.image = image;
NSLog(@" Reatriving ImageData...: %@", @"IMAGE URL");
}
else
{
dispatch_async(mainQueue, ^(void) {
NSString *url = @"IMAGE URL";
NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage* image = [[UIImage alloc] initWithData:imageData];
imageFlag.image = image;
[imagesDictionary setObject:imageData forKey:@"IMAGE URL"];
NSLog(@" Downloading Image...: %@", @"IMAGE URL");
});
}
(...)
}
GitHub中的项目:https://github.com/GabrielMassana/AsynchronousV2.git
我知道如果项目很大并且有很多单元格,我可能会耗尽内存。但我觉得这个解决方案对于新手来说是个不错的方法。
您对该项目有何看法? 如果项目非常大,最好的选择是将图像保存在磁盘中吗?但问题是磁盘内存耗尽的可能性,不是吗?也许,那么,我们需要一种机制来删除磁盘上的所有图像。
答案 0 :(得分:4)
使用NSCache保存下载的图像而不是NSDictionary。这将在低内存情况下管理自己,并删除暂时无法访问的项目。在这种情况下,如果需要,将再次从URL加载它们。