2013-07-30 1 views
0

Я пытаюсь кэшировать образ, полученный из Flickr. Чтобы создать уникальное имя файла для кэшированного изображения, я использую CFURLCreateStringByAddingPercentEscapes, чтобы уклониться от URL-адреса. Добавляя это в каталог кэша, я получаю URL-адрес со встроенным URL-адресом Flickr, соответствующим проценту экранированного; но когда я пытаюсь кэшировать изображение, используя NSData writeToURL: options: error: Я получаю «Операция не может быть завершена. Нет такого файла или каталога» - и она показывает URL-адрес файла с исходным, неэкранированным URL-адресом Flickr, где файл имя должно быть.% escapes удалено в NSData writeToURL

Например, я NSLog в 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/рик/Library/Application Support/iPhone Симулятор/6.1/Приложения/77C4A7AA-C386-4575-AD21-B4027D080408/Библиотека/Кэш/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); 
      }     
     }); 

    } 

} 

Заранее спасибо за вашу помощь!

+0

Возможно показать код. Как создается экранированный путь, как создается URL-адрес из пути, ...? –

+0

@Martin R, я редактировал вопрос, чтобы включить код. Возможно, стоит отметить, что если я заменил код, который создает экранированный URL, с кодом, который устанавливает строку в @ "test", тогда writeToURL будет успешным. – user2635140

+0

Я думаю, вы можете быть правы, что 'writeToURL' удаляет процентные escape-последовательности. Что произойдет, если вы запустите свой 'photoURLString' через' CFURLCreateStringByAddingPercentEscapes', эффективно пропустив свою уже пропущенную строку? –

ответ

0

Проблема заключается в том, что [NSURL URLWithString:...] анализирует данную строку и интерпретирует на процентов побегов. Как правило, для создания URL-адреса для пути файловой системы следует использовать fileURLWithPath: .

В вашем случае, следующий простой код должен работать:

NSURL *cachedPhotoURL = [cacheDirectoryURL URLByAppendingPathComponent:photoURLString] 
+0

Вот и все! Бесконечно благодарен! – user2635140

Смежные вопросы