Я пытаюсь кэшировать образ, полученный из 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);
}
});
}
}
Заранее спасибо за вашу помощь!
Возможно показать код. Как создается экранированный путь, как создается URL-адрес из пути, ...? –
@Martin R, я редактировал вопрос, чтобы включить код. Возможно, стоит отметить, что если я заменил код, который создает экранированный URL, с кодом, который устанавливает строку в @ "test", тогда writeToURL будет успешным. – user2635140
Я думаю, вы можете быть правы, что 'writeToURL' удаляет процентные escape-последовательности. Что произойдет, если вы запустите свой 'photoURLString' через' CFURLCreateStringByAddingPercentEscapes', эффективно пропустив свою уже пропущенную строку? –