如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?

Posted

技术标签:

【中文标题】如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?【英文标题】:How to cache images on disk with SDWebImage or AFNetworking in a huge CollectionView? 【发布时间】:2014-03-31 23:03:14 【问题描述】:

我在我的应用程序中使用AFNetworking 来下载图像的de Url、代码和详细信息。我将所有这些NSStrings 存储在NSMutableArray 中的那些对象中的NSObject 中。我使用NSMutableArray 异步获取带有SDWebImage 的图像,但是在下载了一些图像后,我的应用程序崩溃了 Received memory warning 我尝试在AFNetworking 中使用相同的方法,但什么也没有发生。我对这两个库都使用了这种方法。

[self.pictureImg setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:kDefaultLoadingImage]];

我想知道如何cache 磁盘上的图像以及如何在需要时清理缓存。我不在乎你使用AFNetworking 还是SDWebImage。我在我的自定义 cells 中使用该方法。

谢谢!

【问题讨论】:

【参考方案1】:

只需使用这个FastImageChache 库。它可以根据需要在磁盘上缓存图像。

【讨论】:

【参考方案2】:

当您“收到内存警告”时调用此方法

[SDWebImageManager.sharedManager.imageCache clearMemory];

【讨论】:

【参考方案3】:

试试这个,

SDImageCache *imageCache = [SDImageCache sharedImageCache];

[imageCache clearMemory];

【讨论】:

【参考方案4】:

对于这种方法,AFNetworking 自己处理缓存,除非你不忽略 NSURLRequest 的缓存属性

【讨论】:

【参考方案5】:
[self.profileImage setImageWithURL:[NSURL URLWithString:urlString]
                    placeholderImage:[UIImage imageNamed:@"img_default"]
                             options:SDWebImageProgressiveDownload];

【讨论】:

【参考方案6】:

试试这个!在 AFTNetworking 中为您的单元格使用 __weak

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024     // 10MB. memory cache
                                                      diskCapacity:100 * 1024 * 1024     // 50MB. on disk cache
                                                          diskPath:nil];
    sessionConfiguration.URLCache = cache;
    sessionConfiguration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;

在collectionView:cellForItemAtIndexPath:

 __weak YOUR_CUSTOM_CELL *cell = (YOUR_CUSTOM_CELL *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
NSURLRequest *requestL = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", [your_model.url_image stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
[your_cell.your_image_view setImageWithURLRequest:requestL placeholderImage:[UIImage imageNamed:@"test"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
    your_cell.your_image_view.image = image;
 failure:nil];

希望对你有帮助!

【讨论】:

以上是关于如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?的主要内容,如果未能解决你的问题,请参考以下文章

使用Storyboard的CollectionView样式

CollectionView [高分辨率] 图像上的 iOS 内存峰值

如何在 Ember.CollectionView 中使用模板

如何在 Swift 中使用宽度约束将 Xib 加载到 CollectionView?

如何使用更少的内存在 collectionView 中显示照片库

如何在所有设备中使用 swift4 在 CollectionView 中显示两列