在NSData writeToURL中删除了百分比转义

时间:2013-07-30 19:13:53

标签: nsdata nsurl

我正在尝试缓存从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);
            }                
        });

    }

}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题是[NSURL URLWithString:...]解析给定的字符串而解释 百分之百逃脱。通常,要为文件系统路径创建URL,fileURLWithPath: 应该使用。

在您的情况下,以下简单代码应该有效:

NSURL *cachedPhotoURL = [cacheDirectoryURL URLByAppendingPathComponent:photoURLString]