我在两个应用程序(一个 iOS,另一个 Mac)之间进行了工作设置,它们都将文件放置在 ubiquity 容器中,并使用 NSMetadataQuery 监视该容器。在大多数情况下,查询几乎会在目录中的文件被 setUbiquitous:YES 后立即更新。
然而,关于另一个讨厌的 iCloud 错误,它可能导致容器在同步时完全清空(自动,而不是由应用程序或用户),一旦应用程序之间的“干净设置”被所述错误损坏,查询 - 在仅限 iPhone 端 - 不再更新。
如果我将文件添加到 iPhone 上的容器中,Mac 会立即看到它们。但是如果我在 Mac 端添加文件,iPhone 永远不会更新。如果我使用计时器和文件管理器来扫描容器,我可以确认文件在内容中列出。这是不识别它们的查询。
虽然我不认为这是代码问题,但我会在此处包含它。我认为这是一个“iCloud 是测试版(充其量)”问题,我想知道是否有人可以回答这个问题:由于退出并重新启动应用程序确实会正确导致查询更新,有谁知道如何强制NSMetadataQuery 到更新? 删除它并制作另一个没有任何作用。
这是查询代码(我告诉你它正确地报告给任何 NSNotification 监视器):
self.query = [[[NSMetadataQuery alloc] init] autorelease];
[query setDelegate:self];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]];
[query startQuery];
这是轮询代码(我告诉你它说文件夹中有文件):
- (void)pollUbiquitousStore:(NSTimer *)aUbiquitousStoreMonitor {
//Query update
NSArray *topLevelCloudContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self.fileController.cloudFolderURL.path stringByAppendingPathComponent:@"Documents"] error:nil];
NSLog(@"known iCloud url: %@ contents: %@", self.fileController.cloudFolderURL, topLevelCloudContents);
这是我观看查询的地方(我得到结果,除非系统已被冲洗):
//Refresh
id queryGatheringObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryGatheringProgressNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
refresh((NSMetadataQuery *)[note object]);
}];
id queryUpdateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryDidUpdateNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
refresh((NSMetadataQuery *)[note object]);
}];
现在,你可能会说“你说它已经被水洗了,为什么不重新开始呢?” 我回答 - 我不能告诉用户他们需要从两台设备上删除这两个应用程序,关闭 iCloud,从两台计算机上的“文档和数据”中删除该应用程序,重新下载这两个应用程序,然后“这个问题将会发生随时再次”。我正在尝试在应用程序中构建主要冗余。
谢谢!