我禁用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后,它总是被调用。知道为什么吗?
答案 0 :(得分:2)
我遇到了同样的问题,但我在项目中使用ARC。这可以通过将ivar设置为self.query变量来解决。
@property (nonatomic, strong) NSMetadataQuery *query;
我认为,对于您的问题,因为您没有使用ARC,您可能需要做以下事情:
您需要设置属性
@property (nonatomic, retain) NSMetadataQuery *query;
答案 1 :(得分:0)
从iOS5开始,NSMetadataQuery
的搜索范围只能设置为无处不在的事物(NSMetadataQueryUbiquitousDocumentsScope
和NSMetadataQueryUbiquitousDataScope
),因此在禁用iCloud的情况下使用它将无法使用。
因为您可能正在猜测queryDidFinishGathering
从未被调用的原因是因为您的查询范围,所以还不支持本地目录(但可疑的是不会抛出异常或错误:))
在我看来,NSMetadataQuery类没有完全移植到iOS,在OSX中可以设置更多的范围,可以设置更多种类的NSPredicate
,NSSortDescriptors
工作等。