Сортировка массива объектов NSURL по дате создания - PullRequest
3 голосов
/ 04 января 2012

Мои изображения кэшируются в каталог (/ Library / Caches / ImageCache /).Когда каталог превышает определенный размер, я хотел бы удалить самый старый файл в каталоге.Для выполнения этой задачи я использую NSFileManager для извлечения содержимого каталога.Затем я пытаюсь отсортировать этот массив по дате и удалить самый старый объект.

Моя проблема в том, что моя программа падает, когда я пытаюсь отсортировать массив по ключу NSURLCreationDateKey.

NSFileManager *defaultFM = [NSFileManager defaultManager];
NSArray *keys = [NSArray arrayWithObjects:NSURLNameKey, NSURLCreationDateKey, nil];
NSURL *cacheDirectory = [self photoCacheDirectory];  // method that returns cache URL
NSArray *cacheContents = [defaultFM contentsOfDirectoryAtURL:cacheDirectory
                                  includingPropertiesForKeys:keys
                                                     options:NSDirectoryEnumerationSkipsSubdirectoryDescendants
                                                       error:nil];

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:NSURLCreationDateKey ascending:YES];
NSArray *sortedArray = [cacheContents sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

Программа падает в последней строке.С ошибкой:

* Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[valueForUndefinedKey:]: этот класс не соответствует значению ключа, кодирующему ключ NSURLCreationDateKey.1010 *

Ответы [ 2 ]

5 голосов
/ 04 января 2012

РЕДАКТИРОВАТЬ: Лучший ответ

Если это не сработает, вам придется написать свой собственный блок сравнения и получить даты для сравнения вручную: (*

[cacheContents sortUsingComparator:^ (NSURL *a, NSURL *b) {
    // get the two dates
    id da = [[a resourceValuesForKeys:[NSArray arrayWithObject:NSURLCreationDateKey] error:nil] objectForKey:NSURLCreationDateKey];
    id db = [[b resourceValuesForKeys:[NSArray arrayWithObject:NSURLCreationDateKey] error:nil] objectForKey:NSURLCreationDateKey];

    // compare them
    return [da compare:db];
}];

(Тот же отказ от ответственности по-прежнему применяется, но я даже не уверен, что он скомпилируется;) - хотя вы поняли!)


Вот мой первый ответ (включен сюда для потомковно в основном это просто показывает, насколько важно правильно прочитать вопрос:)

Это потому, что вы получаете массив NSURL объектов;у них нет свойства NSURLCreationDateKey.

Попробуйте это (отказ от ответственности - это не на 100% будет работать)

NSString *key = [NSString stringWithFormat:@"fileAttributes.%@", NSURLCreationDateKey];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES];

Ваш ключ для сортировки является свойством словаря fileAttributesчто, в свою очередь, является собственностью вашего перечислителя.

0 голосов
/ 04 января 2012

Я не уверен в этом, но я думаю, что contentOfDirectoryAtURL: метод возвращает список URL, которые не являются объектами KVC. Чтобы получить желаемую недвижимость от NSURL, вам нужно позвонить:

getResourceValue:forKey:error:

Поскольку это не является KVC-совместимым, вы не сможете использовать дескриптор сортировки, и вместо этого вам нужно будет использовать подпрограмму типа [cacheContents sortedArrayUsingComparator: ...]

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