Поиск метаданных файла с NSMetadataQuery
Для Вашего приложения для поиска метаданных Центра внимания необходимо создать запрос с помощью класса NSMetadataQuery, предоставленного платформой Основы. Запросы могут быть выполнены в двух режимах: асинхронный, и асинхронный с живыми обновлениями. Первое просто выполняет поиск на файлах, существующих во время начального поиска. Последний продолжает искать. обновление данных как файлы, выполняющие или больше не выполняющие поисковое обновление параметров.
Существует четыре основных шага для выполнения асинхронного запроса метаданных:
Определение и инициализация поиска.
Инициирование поиска.
Прислушайтесь к пакетным уведомлениям.
Прислушивание к уведомлению завершения.
Остановка запроса.
Обработка результатов.
Живой асинхронный запрос Центра внимания позволяет Вашему приложению контролировать указанный объем для изменений, происходящих 'на лету'. Единственная значительная разница в коде - то, что вместо того, чтобы остановить запрос, Вы просто приостанавливаете запрос при обработке результатов, и затем возобновляете поиск, когда завершается обработка.
Создание статического поиска метаданных файла
Статический поиск Центра внимания является поиском, просто работающим, возвращает результаты и выходы. это предназначается как разовый поиск, не наблюдающий изменения (который является возможным использованием живые поиски, обсужденные в Создании Живого Поиска.
Определение поиска
Первый шаг в создании запроса определяет поисковое выражение, возвращающее желаемые результаты. Если Вы используете MDMetadataQuery
для выполнения запроса создайте предикат поискового выражения с помощью синтаксиса, описанного в Синтаксисе выражения Запроса Метаданных Файла. Необходимо зарегистрировать уведомление для информирования Вас, когда пакеты данных возвращаются и когда начальный поиск завершен. Можно также дополнительно зарегистрировать объем, сортировку и делегата.
Создайте
NSMetadataQuery
экземпляр.Регистр для получения
NSMetadataQueryDidUpdateNotification
уведомление, отправляющееся, когда пакеты поискового содержания возвращается.Это уведомление не может быть сгенерировано в зависимости от пакетного значения.
Регистр для получения
NSMetadataQueryDidFinishGatheringNotification
уведомление, отправляющееся, когда завершается начальный поиск.
Установка поиска запроса
Поисковый предикат создается с помощью синтаксиса, указанного в Синтаксисе выражения Запроса Метаданных Файла. Поля, которые могут искаться, определяются в Ссылке Атрибутов Метаданных Файла. Ссылки атрибутов перечисляют доступные ключи метаданных и тип данных, которыми необходимо снабдить для поиска того атрибута (строка, число, массив строк, даты или Универсального Идентификатора типа.
Установка порядка сортировки
Если Вы используете NSMetadataQuery
, можно указать порядок сортировки результатов путем обеспечения массива дескрипторов вида. Сортировка основывается на ключе атрибута метаданных каждого, возвратился NSMetadataItem
объект.
Ограничение поискового объема
Приложение ограничивает, где результаты поиска собраны из путем указания поискового объема. Поисковый объем предоставлен для запроса как массив предопределенных констант расположения, URLs и путей к каталогам. Предопределенные константы расположения обеспечивают удобные значения для ограничения запроса к корневому каталогу пользователя, локально смонтированным объемам и корневому каталогу пользователя или удаленным смонтированным объемам.
Поисковые объемы указывают, где запрос метаданных ищет файлы. Таблица 2-1 перечисляет доступные объемы.
Постоянный объем | Поддерживаемые операционные системы | Описание |
---|---|---|
iOS и OS X | Ищите все файлы в каталогах Documents каталогов контейнера iCloud приложения. | |
iOS и OS X | Ищите все файлы не в каталогах Documents каталогов контейнера iCloud приложения. | |
OS X | Ищите все смонтированные пользователями удаленные объемы. | |
OS X | Ищите все локальные смонтированные объемы, включая пользовательский корневой каталог. Корневой каталог пользователя ищется, даже если это - удаленный объем. | |
OS X | Ищите корневой каталог пользователя. |
Поисковые объемы указаны как массив констант объема.
Отправьте свой экземпляр
NSMetadataSearch
asetSearchScopes:
сообщение, передавая массив надлежащих объемов.Этот запрос будет искать каталог Пользователя на компьютере, а также папке Documents iCloud. Этот тот же поисковый код мог быть выполнен на iOS путем простого удаления неподдерживаемого
NSMetadataQueryUserHomeScope
постоянный объем.
Запущение поиска
Как только Вы создали и сконфигурировали объект запроса, можно выполнить сам запрос. При выполнении запрос обычно имеет две фазы: начальная буква заканчивается, собирая фазу и фазу живого обновления.
Во время начальных результатов, собирающих фазу, существующее системное хранилище Центра внимания ищется файлы, соответствующие поисковое выражение. Запрос отправляет уведомления, когда результаты возвращаются в пакетах с помощью NSMetadataQueryDidUpdateNotification
. В едином запросе это может быть полезно для указания состояния поискового прогресса, в то время как в живых поисках это становится более важным.
Запрос посылает заявление NSMetadataQueryDidFinishGatheringNotification
уведомление, когда начальные результаты, собирающие фазу, завершился.
Для запущения поиска отправьте a startQuery
обменивайтесь сообщениями к своему экземпляру NSMetadataSearch
.
Доступ к возвращенным результатам
Прежде чем Ваше приложение взаимодействует с возвращенными результатами, оно должно сначала остановить запрос. Можно отключить обновления во время начальной сборочной фазы поиска или во время фазы живого обновления.
Приложение определяет число результатов, возвращенных путем вызова NSMetadataQuery
метод экземпляра resultCount
. Приложение тогда элементы результата частного лица доступов их индексируемой позицией. Вместо того, чтобы пересекать results
(который предназначается для использования с Привязкой Какао), лучше запросить элемент результата в желаемом индексе с помощью resultAtIndex:
метод.
Элементы результата возвращаются как экземпляр объекта типа NSMetadataItem
. Каждый объект инкапсулирует атрибуты метаданных для файла. Ваше приложение тогда получает атрибуты метаданных от этих элементов путем передачи каждого экземпляра a valueForAttribute:
сообщение с именем желаемого атрибута метаданных.
Остановите происходящий запрос.
Выполните итерации по результатам, выполнение любого действия является подходящим для Вашего приложения.
Удалите наблюдателей для уведомлений.
Если Вы намереваетесь выполнить запрос многократно, этот шаг является дополнительным. Однако, если Вы намереваетесь использовать тот же код установки, можно хотеть удалить наблюдателей независимо.
Завершенный статический поиск
Создание Статического Поиска Метаданных Файла показывает код, требуемый реализовать статический поиск.
Перечисление 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 |
Создание живого поиска
Живой поиск сконфигурирован способом, виртуальным к идентичному поиску с только небольшим количеством изменений.
Запрос должен быть приостановлен с помощью
disableUpdates
прежде, чем получить доступ к обновленным данным.Данные обычно обрабатываются в
queryDidUpdate:
метод в некоторой форме.Запрос тогда перезапущен с помощью
enableUpdates
продолжать поиск.