1

Carbon と Cocoa の両方のバージョンの Spotlight API をいじっていますが、同じ問題が時々発生するようです。クエリ実行されず、通知も発生しません。ただし、ほとんどの場合は実行されるため、何か奇妙なことが起こっていることを強調したいと思います。

私は特定のアプリを書いているわけではありません。これは単なる Spotlight テスト ハーネスであるため、クエリはユーザー入力に基づいて実行されません。代わりにapplicationDidFinishLaunching:、コントローラー内で構成および実行されます。もともとこれを で実行しようとしましawakeFromNibたが、その場合、クエリは実行されませんでした。(私の理論では、RunLoop はまだ開始されていませんが、よくわかりません。)

applicationDidFinishLaunching:Carbonのコードは次のとおりです。

CFStringRef predicate = CFSTR("kMDItemContentTypeTree == 'public.movie'");
_query = MDQueryCreate(NULL, predicate, NULL, NULL);
_query = (MDQueryRef)CFMakeCollectable(_query);
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(notify:)
                                             name:nil
                                           object:(id)_query];
MDQueryExecute(_query, kMDQueryWantsUpdates);

以上、記憶で書いたので、原文にない誤字脱字があるかもしれません。元のコードは、時々まったく動作しないことを除けば、問題なくコンパイルおよび実行されます。

何を与える?おそらくapplicationDidFinishLaunching:、Spotlight クエリには適切な場所ではありません。

4

1 に答える 1

1

applicationDidFinishLaunching で Spotlight クエリを開始しましたが、問題はないので、それはあなたの問題ではないと思います。

試してみたいことがいくつかあります。addObserver:selector:name:object で名前に nil を渡すのではなく、名前に NSMetadataQueryDidFinishGatheringNotification を渡し、名前に NSMetadataQueryDidUpdateNotification を渡す 2 番目の呼び出しを行ってみてください。1 つ目は、クエリの初回実行が終了したときに結果を生成します。2 つ目は更新情報を提供します。(ただし、何かが変わった場合のみ。)

于 2011-12-16T03:39:50.383 に答える