我在两个应用程序(一个iOS,另一个Mac)之间有一个工作设置,它们都将文件放在普遍存储容器中,并使用NSMetadataQuery监视该容器.在大多数情况下,查询几乎在文件设置后立即更新:目录中为YES.
然而,相对于另一个令人讨厌的iCloud错误,它可以导致容器在同步时自动清空(自动,而不是由应用程序或用户),一旦应用程序之间的"干净设置"被所述错误查询破坏 - 在仅限iPhone方面 - 不再更新.
如果我将文件添加到iPhone上的容器中,Mac会立即看到它们.但如果我在Mac端添加文件,iPhone永远不会更新.如果我使用计时器和文件管理器扫描容器,我可以确认文件列在内容中.这是不能识别它们的查询.
虽然我认为这不是代码问题,但我会将其包含在此处.我认为这是一个"iCloud is beta(at best)"问题,我想知道是否有人可以回答这个问题:由于退出并重新启动应用程序确实导致查询更新,有没有人知道如何强制 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];
Run Code Online (Sandbox Code Playgroud)
这是轮询代码(我告诉你它说文件夹中有文件):
- (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);
Run Code Online (Sandbox Code Playgroud)
这是我查看查询的地方(一旦系统被清洗,我得到的结果除外):
//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]);
}];
Run Code Online (Sandbox Code Playgroud)
现在,你可能会说"你说它已被冲洗,为什么不重新开始?" 我回答 - 我无法告诉用户他们需要从两台设备中删除这两个应用程序,关闭iCloud,从两台计算机上的"设置"中的"文档和数据"中删除该应用程序,重新下载这两个应用程序,并且"此问题将发生任何时候".我正在尝试在应用程序中构建主要冗余.
谢谢!
| 归档时间: |
|
| 查看次数: |
1249 次 |
| 最近记录: |