从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中的一些很好的答案。
我想知道这个函数的结果是否总能获得有效的文件名。有没有人有更好的文件名生成器?
答案 0 :(得分:1)
如果您进行了正确的联网,NSURLCache
可以自动处理缓存图像。
但是,我觉得你真的对缓存感兴趣,但是(或多或少永久地)存储图像
在这种情况下,为您的应用构建合适的模型。
因为您没有告诉我们您要存储的图像是什么,所以我不能比这更有帮助:
如果您使用的是iOS 5 + / OS X 10.7+,则可以使用NSAttributeDescription
的allowExternalBinaryDataStorage设置让NSSQLiteStoreType
句柄命名,创建,检索,更新和删除支持代表您透明地显示图像数据的文件。
如果必须支持较旧的OS版本,仍可以通过transient属性使用外部存储。但是,您的实体描述必须具有数据文件名称的属性。在这种情况下,图像数据的SHA-1(可通过CommonCrypto框架获得)将提供良好的文件名。
<强>除了强>
如果您在Objective-C的答案中找到了该代码,请将其下载并删除上述代码:
-[NSString stringByAddingPercentEscapesUsingEncoding:]
和CFURLCreateStringByAddingPercentEscapes
完全按照他们(或他们的文档)的说法行事。