如何监视本地文档目录NSMetaDataQuery

时间:2011-11-17 22:16:36

标签: iphone objective-c ios cocoa-touch

使用iCloud,我设置了一个类似的MetaDataQuery:

[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

如何为我的普通本地文档目录设置相同的MetaDataQuery?

以下代码将为我提供我目录中的静态文件列表 - 但我正在寻找一种更加动态的方式,以便我可以使用NSMetadataQueryDidUpdateNotification

以下是我在documentsDirectory中查找文件的静态代码:

NSArray* localDocuments = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:
                           [self documentsDirectory] error:nil];

NSArray *onlyPQs = [localDocuments filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.pq'"]];

NSLog(@"local file count: %i", [onlyPQs count]);

for (int i=0; i < [onlyPQs count]; i++) {
    NSLog(@"LOCAL:%@", [onlyPQs objectAtIndex:i]);
}

3 个答案:

答案 0 :(得分:5)

我一直在寻找这个问题的答案,根据文档(Searching iCloud and the Desktop),这是不可能的:

  

与桌面不同,iOS应用程序的沙箱无法搜索   使用元数据类。为了搜索你的应用程序   沙箱,您将需要遍历沙箱文件中的文件   系统递归使用NSFileManager类。

在Mac OS X上定义了三个额外的范围:NSMetadataQueryUserHomeScopeNSMetadataQueryLocalComputerScopeNSMetadataQueryNetworkScope,可用于实现此目的。

答案 1 :(得分:0)

将类与NSFilePresenter对应,并将实例与[NSFileCoordinator initWithFilePresenter:]一起使用。

使用NSFileCoordinator实例对目录URL进行协调读取,并且您的子类应通过以下回调(不完整的列表,还有更多可用的回调)接收更新:

  • presentedSubitemDidChangeAtURL:
  • presentedSubitemDidAppearAtURL:
  • presentedSubitemAtURL:didMoveToURL:
  • accommodatePresentedSubitemDeletionAtURL:completionHandler:

子项是正在读取的目录的后代。如果显示的目录本身是文件包,则将应用一些附加规则。查看NSFilePresenter文档。

编辑:由于苹果方面的一些错误,一些NSFilePresenter方法根本没有被调用。参见https://stackoverflow.com/a/19343823/193011https://www.objc.io/issues/10-syncing-data/icloud-document-store/#defective-notifications

此方法要求使用NSFilePresenter进行文件系统更改。通过其他方式提交的更改不会被提取。

答案 2 :(得分:0)

您可以使用 kqueue 监视本地文档目录。 Apple 有 sample code 可用(在 Objective-C 中)。