禁用iCloud时是否可以使用NSMetadataQuery?

时间:2012-04-19 12:30:37

标签: iphone ios ios5 icloud

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

//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后,它总是被调用。知道为什么吗?

2 个答案:

答案 0 :(得分:2)

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

@property (nonatomic, strong) NSMetadataQuery *query;

我认为,对于您的问题,因为您没有使用ARC,您可能需要做以下事情:

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

    @property (nonatomic, retain) NSMetadataQuery *query;
    

答案 1 :(得分:0)

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

因为您可能正在猜测queryDidFinishGathering从未被调用的原因是因为您的查询范围,所以还不支持本地目录(但可疑的是不会抛出异常或错误:))

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