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

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

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

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];

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

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

Другие вопросы по тегам