如果您创建一个香草项目并使之成为您的应用程序委托的实现,则:

@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]占位符更改为其他形式,当然,还使用了NSMetadataItemFSNameKeyNSMetadataItemURLKeykMDItemContentType。除了上述单个最简单的情况外,其他任何方法都无效。

我肯定错过了NSMetadataQuery的一些重要知识,我之前曾广泛使用它,并取得了巨大的成功,因为否则每个人都会评论它的无用性。

最佳答案

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

我想知道苹果是否不希望Spotlight用来完全列出目录的内容-这可能是一种效率很低的方法-因此它们正在过滤掉“过于广泛”的查询。如果将“”更改为其他名称(例如“ F”),它是否起作用?

“ -startQuery”返回BOOL,您是否看到了返回的内容?

10-06 02:49