2

我在 iOS 应用程序的UICollectionView中使用SDWebImage进行图像缓存。

一切都很好,但是,当用户在集合视图上快速滚动时,在将占位符替换为缓存图像之前总会有一点停顿。我相信这是由于缓存检查。为了更好的用户体验,一旦图像被实际缓存,我希望单元格显示正确的图像而不是占位符。如果我可以获得缓存图像的本地(设备)文件系统路径并将其存储在Show实例中,并使用它(如果存在)而不是我的占位符,这将很容易。

有可能将成功块传递给setImageWithURL方法但是,它获得的唯一参数是UIImage实例(实际上在 master 分支中也有一个名为cached的BOOL变量也被传递)。那么 - 是否有可能直接从UIImage实例获取图像的文件系统路径?或者我应该修改SDWebImage以便将这些信息传递给缓存的实例?或者有没有更好的方法来实现我之前描述的目标?

我的Show类有imageURL,下面是 show cell 如何使用 SDWebImage:

#import "ShowCell.h"
#import <SDWebImage/UIImageView+WebCache.h>

@implementation ShowCell

@synthesize imageView = _imageView;
@synthesize label = _label;
@synthesize show = _show;

- (void)setShow:(Show *)show
{
    if (_show != show) {
        self.label.text = show.title;
        if (show.imageURL) {
            [self.imageView setImageWithURL:[NSURL URLWithString:show.imageURL]
                           placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
        }
        _show = show;
    }
}

@end
4

2 回答 2

6

有一些私有SDImageCache方法可以获取缓存图像的文件系统路径。我们可以通过类别公开这些方法。只需将下面的代码放入,SDImageCache+Private.h然后将其添加到您的项目中:

#import "SDImageCache.h"

@interface SDImageCache (PrivateMethods)

- (NSString *)defaultCachePathForKey:(NSString *)key;
- (NSString *)cachedFileNameForKey:(NSString *)key;

@end
于 2014-03-29T13:24:50.660 回答
1

我有一个类似的问题,请参阅:SDWebImage 显示缓存中图像的占位符

基本上我分叉了项目来解决这个问题。

更新:

您可以这样做以避免闪烁(这适用于项目的主分支):

[imageView setImageWithURL:url placeholderImage:imageView.image options:0 
 progress:^(NSUInteger receivedSize, long long expectedSize) {
        imageView.image = [UIImage imageNamed:@"QuestionMarkFace.png"];
 } completed:nil];
于 2013-02-26T20:51:30.823 回答