【问题标题】:Searching files - Objective-C搜索文件 - Objective-C
【发布时间】:2011-06-18 19:59:36
【问题描述】:

我正在尝试搜索文件。这将返回 0 个结果。有谁知道为什么?

NSMetadataQuery *q = [[NSMetadataQuery alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"kMDItemFSName == %@", @"test123456.png"];  
[q setPredicate:predicate];

[q startQuery];
while ([q isGathering]) {
    NSLog(@"%lu", [q resultCount]);
}

[q stopQuery];



更新

NSMetadataQuery *q = [[NSMetadataQuery alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"kMDItemFSName == %@", @"test123456.png"];  
    [q setPredicate:predicate];

    [q startQuery];
    NSLog(@"%lu", [q resultCount]);

    [q stopQuery];

谢谢

【问题讨论】:

    标签: objective-c cocoa macos nspredicate


    【解决方案1】:
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"kMDItemSFName == %@", @"test123456.png"];  
    

    如果您完全从代码中复制了它,我认为 kMDItemSFName 应该是 kMDItemFSName。 ;-)

    您使用的是基础工具模板,还是具有运行循环的完整应用程序?

    基本上,我相信MDMetadataQuery 被设计为异步运行,您可以在其中启动查询,并在查询完成时收到结果通知。

    来自Introduction to Spotlight Query Programming Guide

    对于需要创建的应用程序 查询并与结果交互 有两个 API 可用。这 Spotlight 元数据框架提供 一个低级查询 API,MDQuery,它 允许应用程序搜索 基于元数据值的文件。 MDQuery 是完全可配置的, 允许您同步运行和 异步查询并提供 对频率的细粒度控制 结果批处理。

    Cocoa 框架的NSMetadataQuery 类提供了一个高级 MDQuery 的 Objective-C 接口 API。这个类可以让你 使用的子集构造查询 NSPredicate 类,并执行 异步查询NSMetadataQuery 支持 Cocoa 绑定,允许您显示 结果不写任何 大量的胶水代码。作为 好吧,NSMetadataQuery 允许 应用程序指定的分组 结果分成多个 子类别。 NSMetadataQuery 确实 不支持同步查询和 提供最少的更新通知 随着数据的收集。

    Technical Note TN2192 Querying Metadata With Spotlight

    【讨论】:

    • 我仍然得到 0 个结果。
    • 添加 CoreServices.framework 后,我仍然得到 0 个结果。
    • 我在没有while 循环的情况下更新我的问题。
    【解决方案2】:

    由于 NSMetadataQuery 是异步工作的,因此需要到达运行循环才能获得结果。您可以设置委托或注册在找到结果或有更新时调用的通知。

    我发现 Mac 文档中没有提到这一点,但在 iOS 5 文档中他们明确说明了这一点。也许对于 OS X 来说不是这样?不过你应该试一试。

    “查询在批量返回结果时发送通知。当初始结果收集阶段完成时,查询会向应用程序发送通知。” (发现于http://developer.apple.com/library/mac/#documentation/Carbon/Conceptual/SpotlightQuery/Concepts/QueryingMetadata.html#//apple_ref/doc/uid/TP40001848-CJBEJBHH

    【讨论】:

      【解决方案3】:

      在 .h 文件中声明 NSMetaDataQuery q 并在收到 NSMetadataQueryDidFinishGatheringNotification 时检查 resultCount。

       someFunction
              {
      
                 [NSNotificationCenter defaultCenter] addObserver:self
                                                                   selector:@selector(initalGatherComplete:)
                                                                    name:NSMetadataQueryDidFinishGatheringNotification
                                                                     object:metadataSearch];
      
                      q = [[NSMetadataQuery alloc] init];
                      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"kMDItemFSName == %@", @"test123456.png"];  
                      [q setPredicate:predicate];
      
                      [q startQuery];
      
              }
      
      
                  - (void)initalGatherComplete:sender;
                  {
                      [q stopQuery];
      
                      NSLog(@"%lu",[q resultCount]);
      
                      [[NSNotificationCenter defaultCenter] removeObserver:self
                                                                      name:NSMetadataQueryDidFinishGatheringNotification
                                                                    object:metadataSearch];
      
                  }
      

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-26
        相关资源
        最近更新 更多