URL кэширования - создание соответствующего представления NSString - PullRequest
1 голос
/ 07 февраля 2012

Я хочу кэшировать изображение, загруженное с URL-адреса в локальной файловой системе.

Что я не знаю, так это как я могу создать из URL NSString, который совместим с символами, которые поддерживает файловая система iOS. Например, если я попытаюсь создать файл с : в имени, произойдет сбой.

Какие шаги я должен выполнить, чтобы создать NSString? Является ли простой хэш лучшим способом? Если да, то какая процедура хеширования доступна в iOS, которую я могу использовать?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Я бы использовал хеширование:

  • это даст гораздо более читаемые имена файлов
  • вы избежите проблем с длиной имени файла

md5 должен прекрасно подходить для ваших целей. К сожалению, ios5-sdk содержит только функцию C-String для этого:

CC_MD5(in, in_len, out);

Функция содержится в <CommonCrypto/CommonDigest.h>, там есть и другие хеш-функции.

Вы можете найти информацию о том, как обернуть это в функцию, которая принимает / возвращает строку NSString здесь .

0 голосов
/ 07 февраля 2012

Следующий код принадлежит ZDS_Shared.resolveLocalURLForRemoteURL принимает удаленный URL и возвращает URL, указывающий на файл в файловой системе iOS.Имя файла будет буквенно-цифровой строкой, которая не похожа на исходный URL, но это не должно быть проблемой.

https://github.com/ZarraStudios/ZDS_Shared/blob/master/ZSAssetManager.m#L185

- (NSURL*)resolveLocalURLForRemoteURL:(NSURL*)url
{
  if (!url) return nil;

  NSString *filename = [[url absoluteString] zs_digest];
  NSString *filePath = [[self cachePath] stringByAppendingPathComponent:filename];

  return [NSURL fileURLWithPath:filePath];
}

https://github.com/ZarraStudios/ZDS_Shared/blob/master/NSString%2BZSAdditions.m#L38

// NSString category
- (NSString*)zs_digest
{
  const char *cstr = [self cStringUsingEncoding:NSASCIIStringEncoding];
  return [[NSData dataWithBytes:cstr length:strlen(cstr)] zs_digest];
}

https://github.com/ZarraStudios/ZDS_Shared/blob/master/NSData%2BZSAdditions.m#L38

// NSData category
- (NSString*)zs_digest
{
  uint8_t digest[CC_SHA1_DIGEST_LENGTH];

  CC_SHA1([self bytes], [self length], digest);

  NSMutableString* outputHolder = [[NSMutableString alloc] initWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

  for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
    [outputHolder appendFormat:@"%02x", digest[i]];
  }

  NSString *output = [outputHolder copy];
  MCRelease(outputHolder);

  return [output autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...