2

デフォルトNSMetaDataQueryでは、結果通知はメイン スレッドで受信されます。query.startQueryメインスレッドで呼び出す必要があるようですが[query.setOperationQueue:]、結果通知が送信されるキューを設定するために使用できます。

理想的には、バックグラウンド スレッドがこれらの結果を受信して​​処理することを望み、見つかったファイルに応じて、変数を設定するか、通知をメイン スレッドに投稿します。

私が理解していないのは、操作キューを作成する方法と、このキューで通知を処理する方法です。必要なクラスのサンプルコードと、それらを作成する場所と方法の詳細は素晴らしいでしょう。Apple のドキュメントを読みましたが、通知を処理できるキューを作成する方法がわかりません。

ありがとう

4

2 に答える 2

6

このコードを使用して、バックグラウンド スレッドで通知を処理することができます。

   NSMetadataQuery *query = [NSMetadataQuery new];
   [query enableUpdates];
   // Subscribe to query updates and process then in background thread
   [[NSNotificationCenter defaultCenter] addObserverForName:
    NSMetadataQueryDidUpdateNotification
   object:nil queue:[NSOperationQueue new]
   usingBlock:^(NSNotification __strong *notification)
   {
      // disable the query while iterating
    [query disableUpdates];
     for (NSMetadataItem *item in query.results)
     {
         //do here everything you want with the results 
        //e.g. get values with [item valueForAttribute:NSMetadataItemFSNameKey];
         }          
       [query enableUpdates];
        }];
    [query startQuery];

ヒントとして:

 [NSOperationQueue mainQueue] // added operations execute on the main thread
 [NSOperationQueue new] // iOS 4 and higher - guaranteed to be on the background thread

サブスクライブする必要がある最初の結果を処理する PS NSMetadataQueryDidFinishGatheringNotification- 受信者がクエリの最初の結果収集フェーズを終了したときに投稿され、その後のすべての更新についてNSMetadataQueryDidUpdateNotificationは、私の例のようにサブスクライブする必要があります。クエリには 2 つのフェーズがあるためです。 : 現在一致するすべての結果を収集する最初の収集フェーズと、2 番目のライブ更新フェーズ。

于 2014-03-01T10:09:09.280 に答える