Поиск метаданных файла с NSMetadataQuery

Для Вашего приложения для поиска метаданных Центра внимания необходимо создать запрос с помощью класса NSMetadataQuery, предоставленного платформой Основы. Запросы могут быть выполнены в двух режимах: асинхронный, и асинхронный с живыми обновлениями. Первое просто выполняет поиск на файлах, существующих во время начального поиска. Последний продолжает искать. обновление данных как файлы, выполняющие или больше не выполняющие поисковое обновление параметров.

Существует четыре основных шага для выполнения асинхронного запроса метаданных:

Живой асинхронный запрос Центра внимания позволяет Вашему приложению контролировать указанный объем для изменений, происходящих 'на лету'. Единственная значительная разница в коде - то, что вместо того, чтобы остановить запрос, Вы просто приостанавливаете запрос при обработке результатов, и затем возобновляете поиск, когда завершается обработка.

Создание статического поиска метаданных файла

Статический поиск Центра внимания является поиском, просто работающим, возвращает результаты и выходы. это предназначается как разовый поиск, не наблюдающий изменения (который является возможным использованием живые поиски, обсужденные в Создании Живого Поиска.

Определение поиска

Первый шаг в создании запроса определяет поисковое выражение, возвращающее желаемые результаты. Если Вы используете MDMetadataQuery для выполнения запроса создайте предикат поискового выражения с помощью синтаксиса, описанного в Синтаксисе выражения Запроса Метаданных Файла. Необходимо зарегистрировать уведомление для информирования Вас, когда пакеты данных возвращаются и когда начальный поиск завершен. Можно также дополнительно зарегистрировать объем, сортировку и делегата.

bullet
Определить поиск
  1. Создайте NSMetadataQuery экземпляр.

  2. Регистр для получения NSMetadataQueryDidUpdateNotification уведомление, отправляющееся, когда пакеты поискового содержания возвращается.

    Это уведомление не может быть сгенерировано в зависимости от пакетного значения.

  3. Регистр для получения NSMetadataQueryDidFinishGatheringNotification уведомление, отправляющееся, когда завершается начальный поиск.

Установка поиска запроса

Поисковый предикат создается с помощью синтаксиса, указанного в Синтаксисе выражения Запроса Метаданных Файла. Поля, которые могут искаться, определяются в Ссылке Атрибутов Метаданных Файла. Ссылки атрибутов перечисляют доступные ключи метаданных и тип данных, которыми необходимо снабдить для поиска того атрибута (строка, число, массив строк, даты или Универсального Идентификатора типа.

bullet
Создать запрос
  • Создайте NSPredicate экземпляр с надлежащим Центром внимания запрашивает выражение.

Установка порядка сортировки

Если Вы используете NSMetadataQuery, можно указать порядок сортировки результатов путем обеспечения массива дескрипторов вида. Сортировка основывается на ключе атрибута метаданных каждого, возвратился NSMetadataItem объект.

bullet
Устанавливать поисковый порядок
  • Создайте NSSortDescriptor с желаемым ключом метаданных для сортировки в этом случае kMDItemDisplayName.

Ограничение поискового объема

Приложение ограничивает, где результаты поиска собраны из путем указания поискового объема. Поисковый объем предоставлен для запроса как массив предопределенных констант расположения, URLs и путей к каталогам. Предопределенные константы расположения обеспечивают удобные значения для ограничения запроса к корневому каталогу пользователя, локально смонтированным объемам и корневому каталогу пользователя или удаленным смонтированным объемам.

Поисковые объемы указывают, где запрос метаданных ищет файлы. Таблица 2-1 перечисляет доступные объемы.

Таблица 2-1  поддерживаемые поисковые объемы

Постоянный объем

Поддерживаемые операционные системы

Описание

NSMetadataQueryUbiquitousDocumentsScope

iOS и OS X

Ищите все файлы в каталогах Documents каталогов контейнера iCloud приложения.

NSMetadataQueryUbiquitousDataScope

iOS и OS X

Ищите все файлы не в каталогах Documents каталогов контейнера iCloud приложения.

NSMetadataQueryNetworkScope

OS X

Ищите все смонтированные пользователями удаленные объемы.

NSMetadataQueryLocalComputerScope

OS X

Ищите все локальные смонтированные объемы, включая пользовательский корневой каталог. Корневой каталог пользователя ищется, даже если это - удаленный объем.

NSMetadataQueryUserHomeScope

OS X

Ищите корневой каталог пользователя.

Поисковые объемы указаны как массив констант объема.

bullet
Указать поисковый объем
  • Отправьте свой экземпляр NSMetadataSearch a setSearchScopes: сообщение, передавая массив надлежащих объемов.

    Этот запрос будет искать каталог Пользователя на компьютере, а также папке Documents iCloud. Этот тот же поисковый код мог быть выполнен на iOS путем простого удаления неподдерживаемого NSMetadataQueryUserHomeScope постоянный объем.

Запущение поиска

Как только Вы создали и сконфигурировали объект запроса, можно выполнить сам запрос. При выполнении запрос обычно имеет две фазы: начальная буква заканчивается, собирая фазу и фазу живого обновления.

Во время начальных результатов, собирающих фазу, существующее системное хранилище Центра внимания ищется файлы, соответствующие поисковое выражение. Запрос отправляет уведомления, когда результаты возвращаются в пакетах с помощью NSMetadataQueryDidUpdateNotification. В едином запросе это может быть полезно для указания состояния поискового прогресса, в то время как в живых поисках это становится более важным.

Запрос посылает заявление NSMetadataQueryDidFinishGatheringNotification уведомление, когда начальные результаты, собирающие фазу, завершился.

Для запущения поиска отправьте a startQuery обменивайтесь сообщениями к своему экземпляру NSMetadataSearch.

Доступ к возвращенным результатам

Прежде чем Ваше приложение взаимодействует с возвращенными результатами, оно должно сначала остановить запрос. Можно отключить обновления во время начальной сборочной фазы поиска или во время фазы живого обновления.

Приложение определяет число результатов, возвращенных путем вызова NSMetadataQuery метод экземпляра resultCount. Приложение тогда элементы результата частного лица доступов их индексируемой позицией. Вместо того, чтобы пересекать results (который предназначается для использования с Привязкой Какао), лучше запросить элемент результата в желаемом индексе с помощью resultAtIndex: метод.

Элементы результата возвращаются как экземпляр объекта типа NSMetadataItem. Каждый объект инкапсулирует атрибуты метаданных для файла. Ваше приложение тогда получает атрибуты метаданных от этих элементов путем передачи каждого экземпляра a valueForAttribute: сообщение с именем желаемого атрибута метаданных.

bullet
Получить доступ к результатам
  1. Остановите происходящий запрос.

  2. Выполните итерации по результатам, выполнение любого действия является подходящим для Вашего приложения.

  3. Удалите наблюдателей для уведомлений.

    Если Вы намереваетесь выполнить запрос многократно, этот шаг является дополнительным. Однако, если Вы намереваетесь использовать тот же код установки, можно хотеть удалить наблюдателей независимо.

Завершенный статический поиск

Создание Статического Поиска Метаданных Файла показывает код, требуемый реализовать статический поиск.

Перечисление 2-1  Статический Центр внимания ищет реализацию

// Initialize Search Method
- (void)initiateSearch
{
    // Create the metadata query instance. The metadataSearch @property is
    // declared as retain
    self.metadataSearch=[[[NSMetadataQuery alloc] init] autorelease];
 
    // Register the notifications for batch and completion updates
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(queryDidUpdate:)
                                                 name:NSMetadataQueryDidUpdateNotification
                                               object:metadataSearch];
 
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(initalGatherComplete:)
                                                 name:NSMetadataQueryDidFinishGatheringNotification
                                               object:metadataSearch];
 
    // Configure the search predicate to find all images using the
    // public.image UTI
    NSPredicate *searchPredicate;
    searchPredicate=[NSPredicate predicateWithFormat:@"kMDItemContentTypeTree == 'public.image'"];
    [metadataSearch setPredicate:searchPredicate];
 
    // Set the search scope. In this case it will search the User's home directory
    // and the iCloud documents area
    NSArray *searchScopes;
    searchScopes=[NSArray arrayWithObjects:NSMetadataQueryUserHomeScope,
                  NSMetadataQueryUbiquitousDocumentsScope,nil];
    [metadataSearch setSearchScopes:searchScopes];
 
    // Configure the sorting of the results so it will order the results by the
    // display name
    NSSortDescriptor *sortKeys=[[[NSSortDescriptor alloc] initWithKey:(id)kMDItemDisplayName
                                                            ascending:YES] autorelease];
    [metadataSearch setSortDescriptors:[NSArray arrayWithObject:sortKeys]];
 
    // Begin the asynchronous query
    [metadataSearch startQuery];
 
}
 
// Method invoked when notifications of content batches have been received
- (void)queryDidUpdate:sender;
{
    NSLog(@"A data batch has been received");
}
 
 
// Method invoked when the initial query gathering is completed
- (void)initalGatherComplete:sender;
{
    // Stop the query, the single pass is completed.
    [metadataSearch stopQuery];
 
    // Process the content. In this case the application simply
    // iterates over the content, printing the display name key for
    // each image
    NSUInteger i=0;
    for (i=0; i < [metadataSearch resultCount]; i++) {
        NSMetadataItem *theResult = [metadataSearch resultAtIndex:i];
        NSString *displayName = [theResult valueForAttribute:(NSString *)kMDItemDisplayName];
        NSLog(@"result at %lu - %@",i,displayName);
    }
 
    // Remove the notifications to clean up after ourselves.
    // Also release the metadataQuery.
    // When the Query is removed the query results are also lost.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:NSMetadataQueryDidUpdateNotification
                                                  object:metadataSearch];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:NSMetadataQueryDidFinishGatheringNotification
                                                  object:metadataSearch];
    self.metadataSearch=nil;
}
 
@end

Создание живого поиска

Живой поиск сконфигурирован способом, виртуальным к идентичному поиску с только небольшим количеством изменений.