禁用 iCloud 时是不是可以使用 NSMetadataQuery?
Posted
技术标签:
【中文标题】禁用 iCloud 时是不是可以使用 NSMetadataQuery?【英文标题】:Is it possible to use NSMetadataQuery when iCloud is disabled?禁用 iCloud 时是否可以使用 NSMetadataQuery? 【发布时间】:2012-04-19 12:30:37 【问题描述】:当我禁用 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 后,它总是会被调用。知道为什么吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,但我在项目中使用了 ARC。这可以通过将 ivar 设置为 self.query 变量来解决。
@property (nonatomic, strong) NSMetadataQuery *query;
我认为对于您没有使用 ARC 的问题,您可能需要做以下事情:
-
移除自动释放,完成工作后手动释放。
你需要设置属性
@property (nonatomic, retain) NSMetadataQuery *query;
【讨论】:
【参考方案2】:从 ios5 开始,NSMetadataQuery
的搜索范围只能设置为无处不在的事物(NSMetadataQueryUbiquitousDocumentsScope
和 NSMetadataQueryUbiquitousDataScope
),因此在禁用 iCloud 的情况下使用它是无用的。
正如您可能猜到的那样,从未调用过 queryDidFinishGathering
的原因是因为您的查询范围,目前还不支持本地目录(但可能不会引发异常或错误 :))
在我看来 NSMetadataQuery 类并没有完全移植到 iOS,在 OSX 中可以设置更多的范围,可以设置更多种类的NSPredicate
,NSSortDescriptors
工作等等。
【讨论】:
以上是关于禁用 iCloud 时是不是可以使用 NSMetadataQuery?的主要内容,如果未能解决你的问题,请参考以下文章
在应用程序运行时启用/禁用 Core Data 的 iCloud 同步
在 Safari 中浏览 iCloud Drive 中的文件时,某些应用文件夹被禁用