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因为您知道查询有两个阶段:收集所有当前匹配结果的初始收集阶段和第二个实时更新阶段。

于 2014-03-01T10:09:09.280 回答
1

这很有帮助。如果有人正在寻找这个,这是我用来在 Swift 中实现它的代码:

let nf = NotificationCenter.default

    //add background queue observer for updates during live phase
    nf.addObserver(forName: NSNotification.Name.NSMetadataQueryDidUpdate, object: nil, queue: self.backGroundQueue, using:{_ in 
        self.query.disableUpdates()
        self.resultsArray = self.query.results as! [ResultItem]
        self.query.enableUpdates()
    })

    //add background queue observer for updates during gathering
    nf.addObserver(forName: NSNotification.Name.NSMetadataQueryGatheringProgress, object: nil, queue: self.backGroundQueue, using:{_ in
        self.query.disableUpdates()
        self.resultsArray = self.query.results as! [ResultItem]
        print("progressing... ")
        print("number of results: \(self.query.results.count)")
        self.query.enableUpdates()
    })

    //add background queue observer for finishing gathering phase
    nf.addObserver(forName: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil, queue: self.backGroundQueue, using:{_ in
        self.query.disableUpdates()
        self.resultsArray = self.query.results as! [ResultItem]
        self.query.enableUpdates()
    })


    self.query.searchScopes = [self.thePath]
    self.query.predicate = self.getPredicateToRun()

    self.query.start()
于 2017-09-21T02:53:36.770 回答