从互联网下载的图像中选择缓存文件名的好方法是什么?

时间:2012-10-17 05:45:00

标签: objective-c xcode4.5

从Internet下载的图像中选择缓存文件名以获取缓存目的,以确保无论URL是什么,我们都获得了有效的文件名,这是一种好方法吗?

我们经常从网上挑选图片。将这些图像存储在临时缓存中通常很有用,因此我们不会一次又一次地下载相同的图像。

所以我想,我需要一个cacheFileName。它应该是URL的功能。但是,它不能包含特殊字符,例如:,/,&

换句话说,它必须是有效的文件名。

这样做的方法是什么?

我可以自己做一些事。也许我可以使用看起来很好的URLEncode。但是,我想知道,如果我错过了考虑。

这是我目前使用的代码:

- (NSString *) URLEncodedString {
    NSMutableString * output = [NSMutableString string];
    const char * source = [self UTF8String];
    int sourceLen = strlen(source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = (const unsigned char)source[i];
        if (false && thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

它取自我忘记的stackOverflow中的一些很好的答案。

我想知道这个函数的结果是否总能获得有效的文件名。有没有人有更好的文件名生成器?

1 个答案:

答案 0 :(得分:1)

如果您进行了正确的联网,NSURLCache可以自动处理缓存图像。

但是,我觉得你真的缓存感兴趣,但是(或多或少永久地)存储图像

在这种情况下,为您的应用构建合适的模型。

因为您没有告诉我们您要存储的图像是什么,所以我不能比这更有帮助:

如果您使用的是iOS 5 + / OS X 10.7+,则可以使用NSAttributeDescription的allowExternalBinaryDataStorage设置让NSSQLiteStoreType句柄命名,创建,检索,更新和删除支持代表您透明地显示图像数据的文件。

如果必须支持较旧的OS版本,仍可以通过transient属性使用外部存储。但是,您的实体描述必须具有数据文件名称的属性。在这种情况下,图像数据的SHA-1(可通过CommonCrypto框架获得)将提供良好的文件名。


<强>除了

如果您在Objective-C的答案中找到了该代码,请将其下载并删除上述代码:

-[NSString stringByAddingPercentEscapesUsingEncoding:]CFURLCreateStringByAddingPercentEscapes完全按照他们(或他们的文档)的说法行事。