0

我正在尝试缓存从 Flickr 检索到的图像。为了为缓存的图像创建一个唯一的文件名,我使用 CFURLCreateStringByAddingPercentEscapes 对 URL 进行百分比转义。将其附加到缓存目录中,我得到一个嵌入的 Flickr URL 正确百分比转义的 URL;但是当我尝试使用 NSData writeToURL:options:error: 缓存图像时,我得到“操作无法完成。没有这样的文件或目录” - 它显示文件 URL 和原始的、未转义的 Flickr URL 文件所在的位置名字应该是。

例如,我将 URL NSLog 为:

文件://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 正在删除百分比转义。

有没有办法防止这种情况发生,还是我只需要想出另一种方法来根据 url 生成唯一名称?

以下是相关代码:

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);
            }                
        });

    }

}

在此先感谢您的帮助!

4

1 回答 1

0

问题在于[NSURL URLWithString:...]解析给定的字符串并解释百分比转义。通常,fileURLWithPath: 应该使用为文件系统路径创建 URL。

在您的情况下,以下简单代码应该可以工作:

NSURL *cachedPhotoURL = [cacheDirectoryURL URLByAppendingPathComponent:photoURLString]
于 2013-07-30T19:47:29.427 回答