【问题标题】:NSMetadataQuery won't find files in Lion, Mountain Lion, or MavericksNSMetadataQuery 在 Lion、Mountain Lion 或 Mavericks 中找不到文件
【发布时间】:2014-01-30 02:27:51
【问题描述】:

如果您创建一个普通项目并将其作为您的应用委托的实现:

@interface TESTAppDelegate ()
@property (nonatomic, strong) NSMetadataQuery *query;
@end

@implementation TESTAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(searchProgressed:) name:NSMetadataQueryGatheringProgressNotification object:nil];

    NSMutableArray *predicates = [@[] mutableCopy];
    #define add(format, ...) { \
        [predicates addObject:[NSPredicate predicateWithFormat:format, ##__VA_ARGS__]]; \
    }

    //Toggle which of these lines are commented to experiment with breaking the query
    //add(@"kMDItemKind like[c] %@", @"*"); //Works
    //add(@"(kMDItemContentType != 'com.apple.mail.emlx.part')"); //Works
    //add(@"(kMDItemContentType == 'public.data')"); //Works
    //add(@"kMDItemFSName like[c] %@", @"*"); //DOES NOT WORK
    add(@"kMDItemFSName like[c] %@", @"*Nashville*"); //works...

    self.query = [[NSMetadataQuery alloc] init];
    [_query setPredicate:predicates.count > 1? [NSCompoundPredicate andPredicateWithSubpredicates:predicates] : predicates.lastObject];
    [_query setSearchScopes:@[[@"~/Downloads" stringByExpandingTildeInPath]]];
    NSLog(@"Query %@", [_query startQuery]? @"started" : @"could NOT start!");
}

- (void)searchProgressed:(NSNotification *)note
{
    NSLog(@"searchProgressed: %li", _query.resultCount);
}

@end

您应该能够确认以下“最近”在 NSMetadataQuery 上引入(狮子后)的高度异常行为:它显然不再有效。

如果您按原样运行应用程序,它应该记录类似"searchProgressed 1204" 的内容,这意味着查询找到了结果。但是,如果您在注释掉其他谓词后运行它,它什么也找不到。

我尝试了该行的许多变体,包括通配符或%K 占位符的各种形式,将LIKE[c] 占位符更改为其他形式,当然还有使用NSMetadataItemFSNameKey、@987654326 之类的东西@ 和 kMDItemContentType除了上述单一、最简单的情况外,没有其他方法可以工作

我一定错过了 NSMetadataQuery 的一些重要内容,我之前曾广泛使用它并取得了巨大的成功,否则每个人都会评论它是多么无用。

【问题讨论】:

  • 您的应用是否在沙盒中运行?

标签: cocoa nsmetadataquery


【解决方案1】:

我只是猜测,希望这不会违反 StackOverflow 的规则:

我想知道 Apple 是否不希望使用 Spotlight 来完全列出目录的内容——这可能是一种非常低效的方式——所以他们过滤掉了“过于宽泛”的查询。如果你把“”换成别的东西,比如“F”,会起作用吗?

'-startQuery' 返回一个 BOOL,你看到它返回什么了吗?

【讨论】:

  • 哈哈,太棒了,谢谢威尔。 NSLog(@"Query started? %d", [_query startQuery]); 总是返回 YES;但是,如果我按照您的建议尝试更有限的范围,我可以获得一些成功案例。我正在用扩展实验编辑问题,我会调查这是否真的是根本问题。我对这种可能性感到困惑的是,第一个查询也是一个过于宽泛的通配符,但它确实有效。
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2012-07-25
  • 2013-09-02
  • 2012-08-05
  • 2012-08-10
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多