NSMetaDataQuery を使用して、バンドル識別子に基づいてアプリケーション パスを取得するコードを試しています。Apple 開発サイトにあるサンプル コードに従っていました: 静的スポットライト検索の実装。
私はそれのために次のファイルを書きました
//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
ます。必要なヘッダー ファイルを追加しました。コードはコンパイルおよび実行されますが、2 つのオブザーバーに通知がありません。2 つのメソッドqueryDidUpdate
&にブレークポイントを設定しましたinitalGatherComplete
。しかし、彼らは決して打たれることはありません。私のメインコードが検索の完了を待っていなかったことが失敗の原因だと思いました。しかし、メインで待機しても機能しませんでした。次の質問のコードも試してみました。NSMetadataQuery をよく理解していません
が、無限while
ループで終了しました。