gpt4 book ai didi

objective-c - iCloud NSMetadata 查询结果为空白

转载 作者:行者123 更新时间:2023-11-29 13:22:09 26 4
gpt4 key购买 nike

我一直在努力添加 到我的项目(这对包子来说很痛苦)并且我能够保存和删除文件,但我无法获得存储在 iCloud 中的文件列表。我尝试了大约 10 个不同网站的解决方案(包括 Apple 文档)。每当我调用 [self.query startQuery]; 时,一切似乎都在工作:正确的方法被调用,这些方法完全按照它们应该的方式执行。然后当我要求 在我的应用程序的 iCloud 文档目录中的文件中,我得到两个括号,它们之间没有任何内容(当我在 NSLog 中查看时):File List: ( )。我知道在我的应用程序的 iCloud 文档目录中有许多不同的文档,各种形状、扩展名、大小和名称,因为我一直在使用 iCloud Developer网站检查一切是否正常。我设置查询的第一种方法如下:

- (void)syncWithCloud {
self.query = [[NSMetadataQuery alloc] init];
NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
[query setSearchScopes:[NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, nil]];
//[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey]];
[query setPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey]];

//Pull a list of all the Documents in The Cloud
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidFinishGatheringNotification object:self.query];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidUpdateNotification object:self.query];

[self.query startQuery];
}

process files method接下来是 Apple 提供的:

- (void)processFiles:(NSNotification*)aNotification {
NSMutableArray *discoveredFiles = [NSMutableArray array];

//Always disable updates while processing results.
[query disableUpdates];

//The query reports all files found, every time.
NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {
NSURL *fileURL = [result valueForAttribute:NSMetadataItemURLKey];
NSNumber *aBool = nil;

// Don't include hidden files.
[fileURL getResourceValue:&aBool forKey:NSURLIsHiddenKey error:nil];
if (aBool && ![aBool boolValue])
[discoveredFiles addObject:fileURL];
}

//Update the list of documents.
[FileList removeAllObjects];
[FileList addObjectsFromArray:discoveredFiles];
//[self.tableView reloadData];

//Reenable query updates.
[query enableUpdates];

NSLog(@"File List: %@", FileList);
}

为什么这不给我文件列表或至少某种数据?我是否定义了 NSMetadata 查询错误,也许我的谓词格式不正确?我知道我做错了什么,因为 iCloud 不可能这么复杂(或者可以吗?)。
提前感谢您的帮助!

编辑 #1:我正在继续尝试不同的方法来解决这个问题。使用下面的答案之一,我更改了谓词过滤器,如下所示:

[query setPredicate:[NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey LIKE '*'"]];

我还在 [query enableUpdates] 调用之前添加了以下几行:

for (NSMetadataItem *item in query.results) {
[FileList addObject:[item valueForAttribute:NSMetadataItemFSNameKey]];
}

processFiles 方法中,我尝试将所有代码放在后台线程上,但这没有任何区别 - 事实上,当代码不在后台执行时thread FileList 给我这个 (null) 而不是这个 ( )

我的问题可能与线程管理或内存分配有关吗?请注意,我使用的是 ARC。

编辑 #2:FileList 变量是在我的@interface 中定义并在-(id) 中初始化的 NSMutableArray init 方法,然后调用 processFiles 方法。

编辑 #3:当使用断点测试我的代码时,我发现以下 永远不会通过 - 一次都没有。这让我相信:
A. 没有连接到正确的目录
B. iCloud看不到目录下的文件
C. 我的 NSMetadataQuery 没有正确设置 D.完全不同的东西

这是启动永远不会运行的 for 循环的代码:

NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {

最佳答案

由于您已经正确设置了搜索范围,因此无需在谓词中使用特殊过滤器。只需使用:

query.predicate = [NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey == '*'"];

并获取数组使用:

NSMutableArray *array = [NSMutableArray array];
for (NSMetadataItem *item in query.results) {
[array addObject:[item valueForAttribute:NSMetadataItemFSNameKey]];
}

关于objective-c - iCloud NSMetadata 查询结果为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com