我正在尝试缓存从Flickr检索到的图像。为了为缓存的图像创建唯一的文件名,我使用CFURLCreateStringByAddingPercentEscapes来百分比转义URL。将其附加到缓存目录,我得到一个带有嵌入式Flickr URL的URL正确转义百分比;但是当我尝试使用NSData writeToURL缓存图像时:选项:错误:我得到“操作无法完成。没有这样的文件或目录” - 它显示文件URL与原始的,未转义的Flickr URL所在的文件名字应该是。
例如,我将URL记录为:
文件://localhost/Users/rick/Library/Application%20Support/iPhone%20Simulator/6.1/Applications/77C4A7AA-C386-4575-AD21-B4027D080408/Library/Caches/http%3A%2F%2Ffarm3.static .flickr.com%2F2887%2F9391679341_26643bcafa_b.jpg
但错误消息显示
NSFilePath = / Users / rick / Library / Application Support / iPhone Simulator / 6.1 / Applications / 77C4A7AA-C386-4575-AD21-B4027D080408 / Library / Caches / http://farm3.static.flickr.com/2887/9391679341_26643bcafa_b.jpg
就好像在将URL转换为文件路径的过程中,writeToURL正在删除百分比转义。
有没有办法防止这种情况发生,或者我是否只需要提出另一种方法来根据网址生成唯一的名称?
以下是相关代码:
NSURL *cacheDirectoryURL=[[fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSString *photoURLString= (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)([self.photoURL absoluteString]),
NULL,
(CFStringRef) @"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
if (photoURLString)
{
NSURL *cachedPhotoURL=[NSURL URLWithString:[[cacheDirectoryURL absoluteString] stringByAppendingString:photoURLString]];
NSData *photoData=[NSData dataWithContentsOfURL:cachedPhotoURL];
if (photoData)
{
UIImage *image=[UIImage imageWithData:photoData];
self.imageView.image=image;
[self setupScrollView]; // new image, need to adjust scroll view
} else {
dispatch_queue_t fetchQueue=dispatch_queue_create("photo downloader", NULL);
dispatch_async(fetchQueue, ^{
NSData *photoData=[NSData dataWithContentsOfURL:self.photoURL];
NSError *error;
if ([photoData writeToURL:cachedPhotoURL options:NSDataWritingAtomic error:&error])
{
NSLog(@"Cached photo");
} else {
NSLog(@"Failed to cache photo");
NSLog(@"%@",error);
}
});
}
}
提前感谢您的帮助!
答案 0 :(得分:0)
问题是[NSURL URLWithString:...]
解析给定的字符串而解释
百分之百逃脱。通常,要为文件系统路径创建URL,fileURLWithPath:
应该使用。
在您的情况下,以下简单代码应该有效:
NSURL *cachedPhotoURL = [cacheDirectoryURL URLByAppendingPathComponent:photoURLString]