1

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ループで終了しました。

4

1 に答える 1

0

投稿されたコード サンプルから、SearchQuery は何にも保持されていないように見えるため、すぐに割り当てが解除されます。

于 2014-09-04T23:29:03.920 に答える