NSMetaDataQuery: не получено уведомление об обновлении или сбор завершен

Я пытаюсь некоторый код использовать NSMetaDataQuery, чтобы получить путь приложения на основе
Идентификатор пакета. Я следовал за примером кода, найденным в Apple Dev
сайт: Статическая Spotlight реализация поиска.

Я написал следующие файлы для него

//AppPath.h

void GetAppPath();

@interface SearchQuery: NSObject
{

}

@property (copy) NSMetaDataQuery *metaData;

-(void) initiateSearch;
-(void) queryDidUpdate:sender;
-(void) initalGatherComplete:sender;
@end

Определения, где следующим образом:

void GetAppPath()
{
SearchQuery *query = [[SearchQuery alloc] init];
[query initiateSearch];
}

@Implementation SearchQuery

// 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:self.metadataSearch];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(initalGatherComplete:)
name:NSMetadataQueryDidFinishGatheringNotification
object:self.metadataSearch];

// Configure the search predicate to find all application with the given
//Bundle Id
NSPredicate *searchPredicate;
searchPredicate=[NSPredicate predicateWithFormat:@"NSApplicationBundleIdentifier == 'com.myapp.app'"];
[self.metadataSearch setPredicate:searchPredicate];

// Begin the asynchronous query
[self.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.
[self.metadataSearch stopQuery];

// Process the content.
NSUInteger i=0;
for (i=0; i < [self.metadataSearch resultCount]; i++) {
//Do Something with the result
}

// 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:self.metadataSearch];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSMetadataQueryDidFinishGatheringNotification
object:self.metadataSearch];
self.metadataSearch=nil;
}

@end

Я звоню GetAppPAth метод в main, Я добавил необходимые заголовочные файлы. Код компилируется и запускается, но я не получаю никаких уведомлений обоим наблюдателям.
Я поставил точки останова в двух методах, queryDidUpdate & initalGatherComplete, Но они никогда не попали. Я думал, что сбой был, потому что мой основной код не был
ожидая завершения поиска. Но это не сработало, даже когда я немного подождал. Я также попробовал код в следующем вопросе: Не совсем понимаю NSMetadataQuery
Но это закончилось бесконечно while петля.

1

Решение

Из примера кода, который вы опубликовали, похоже, что SearchQuery ничем не сохраняется, поэтому он немедленно освобождается.

0

Другие решения


По вопросам рекламы [email protected]