3

当我禁用 iCloud 时,我似乎无法让 NSMetadataQuery 工作。我输入了一个有效的搜索 URL,但它从未注册为已完成:

//Check for iCloud
NSURL *ubiq = [[NSFileManager defaultManager] 
               URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
    NSLog(@"iCloud access at %@", ubiq);
    self.query = [[[NSMetadataQuery alloc] init] autorelease];
    [self.query setSearchScopes:[NSArray arrayWithObject:
                                 NSMetadataQueryUbiquitousDataScope]];
    _isiCloudEnabled = YES;
} else {
    NSLog(@"No iCloud access");
    //Get the doc directory
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    self.query = [[[NSMetadataQuery alloc] init] autorelease];
    [self.query setSearchScopes:[NSArray arrayWithObjects:
                                 [NSURL fileURLWithPath:path],nil]];
    _isiCloudEnabled = NO;
}

NSPredicate *pred = [NSPredicate predicateWithFormat: 
                     @"%K like %@", NSMetadataItemFSNameKey, @"*.adoc"];
[self.query setPredicate:pred];
[[NSNotificationCenter defaultCenter] 
 addObserver:self 
 selector:@selector(queryDidFinishGathering:) 
 name:NSMetadataQueryDidFinishGatheringNotification 
 object:self.query];

[self.query startQuery];

queryDidFinishGathering:永远不会被调用。启用 iCloud 后,它总是会被调用。知道为什么吗?

4

2 回答 2

2

我遇到了同样的问题,但我在项目中使用了 ARC。这可以通过将 ivar 设置为 self.query 变量来解决。

@property (nonatomic, strong) NSMetadataQuery *query;

我认为对于您的问题,因为您没有使用 ARC,您可能需要执行以下操作:

  1. 完成工作后删除自动释放和手动释放。
  2. 你需要设置属性

    @property (nonatomic, retain) NSMetadataQuery *query;
    
于 2014-04-08T11:26:08.273 回答
0

从 iOS5 开始,NSMetadataQuery的搜索范围只能设置为普遍存在的事物 (NSMetadataQueryUbiquitousDocumentsScopeNSMetadataQueryUbiquitousDataScope),因此在禁用 iCloud 的情况下使用它是无用的。

正如您可能猜测的queryDidFinishGathering那样,永远不会调用的原因是因为您的查询范围,尚不支持本地目录(但可能不会引发异常或错误:))

在我看来 NSMetadataQuery 类并没有完全移植到 iOS,在 OSX 中可以设置更多的范围,可以设置更多种类NSPredicateNSSortDescriptors工作等等。

于 2012-05-09T11:36:10.660 回答