Как я могу отсортировать результат icloud NSMetadataQuery UIDocument по дате изменения?

У меня есть приложение iOS, в котором используется простая модель UIDocument с одним полем содержимого для хранилища iCloud. Я получаю список документов для заполнения UITableView с помощью NSMetadataQuery. Я хочу, чтобы новые документы отображались в верхней части этой таблицы, но сортировка по умолчанию выглядит как старая -> новая.

Я знаю, что если бы у меня было настраиваемое поле даты в документе, я мог бы отсортировать запрос с помощью NSSortDescriptor в этом поле, но мой вопрос: можно ли отсортировать по внутренней дате изменения файла, созданного через хранилище iCloud UIDocument? Или есть другой предпочтительный способ сделать это?


person Jason N    schedule 09.09.2012    source источник
comment
Вы нашли какое-либо решение для этого?   -  person rizzz86    schedule 28.09.2012


Ответы (2)


Похоже, правильный способ сделать это - установить дескриптор сортировки вашего запроса при его создании. Что-то в этом роде:

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes:[NSArray arrayWithObject:
                            NSMetadataQueryUbiquitousDocumentsScope]];

NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K ENDSWITH '.bin'", 
                                   NSMetadataItemFSNameKey];
[query setPredicate:pred];

NSSortDescriptor *sortDescriptor = 
    [[[NSSortDescriptor alloc] initWithKey:NSMetadataItemFSContentChangeDateKey 
                                 ascending:FALSE] autorelease]; //means recent first
NSArray *sortDescriptors = [NSArray arrayWithObjects:
                                sortDescriptor,
                                nil];        
[query setSortDescriptors:sortDescriptors];

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(queryDidFinishGathering:) 
     name:NSMetadataQueryDidFinishGatheringNotification 
     object:query];

[query startQuery];
person dubemike    schedule 07.11.2012

Суть: как насчет вызова -[NSURL getResourceValue:forKey:error:] и передачи NSURLContentModificationDateKey, а затем выполнения сортировки по убыванию возвращенных значений NSDate.

Подробности: вы можете либо передать компаратор в -[NSMutableArray sortUsingComparator:], который извлекает требуемый NSDate для каждого объекта на лету, либо извлекать их все в новый массив с составным объектом NSDate, id и сортировать массив этого объекта, а затем извлекать ссылки id после завершения сортировки (идиома python decor-sort-undecorate).

person Poulsbo    schedule 02.10.2012