禁用 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 的搜索范围只能设置为无处不在的事物(NSMetadataQueryUbiquitousDocumentsScopeNSMetadataQueryUbiquitousDataScope),因此在禁用 iCloud 的情况下使用它是无用的。

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

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

【讨论】:

以上是关于禁用 iCloud 时是不是可以使用 NSMetadataQuery?的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序运行时启用/禁用 Core Data 的 iCloud 同步

在 Safari 中浏览 iCloud Drive 中的文件时,某些应用文件夹被禁用

iCloud 文档选择器:应用文件夹在导入时被禁用

swift:从自定义应用程序加载时,iCloud 文档似乎被禁用

在 iPhone 设置中禁用每个应用程序的 iCloud

未启用 iCloud 时如何存储核心数据日志?