我正在为我的应用程序做一个备份管理器(通过iCloud)。我做了一些测试,基本原理奏效了。但几天后它就停止了。如果备份文件存在,我将使用NSMetadataQuery进行搜索。我的备份文件名为Backup29112011154133.xml,其中数字表示备份的日期(格式化为ddMMyyyyHHmmss)。我在-viewDidAppear里查过了
- (void)viewDidAppear:(BOOL)animated {
[self checkForRemoteFile];
}
- (void)checkForRemoteFile {
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K like 'Backup*'",NSMetadataItemFSNameKey];
[query setPredicate:pred];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
[query startQuery];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"iCloud is unavailable at the moment" message:nil delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
[alert setTag:TAG_ALERT_NOICLOUD];
[alert show];
}
}
- (void)queryDidFinishGathering:(NSNotification *)notif {
NSMetadataQuery *query = [notif object];
[query disableUpdates];
[query stopQuery];
[self loadRemoteFile:query];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query];
}
- (void)loadRemoteFile:(NSMetadataQuery *)query {
if ([query resultCount] == 1) {
canRestore = YES;
NSMetadataItem *item = [query resultAtIndex:0];
// parse the backup file
[self.tableView reloadData];
} else {
canRestore = NO;
modifDate = @"never";
backupInfoLoaded = YES;
[self.tableView reloadData];
}
}问题是- (void)queryDidFinishGathering:(NSNotification *)notif从未被执行过。我把破碎品和NSLogs离子放在那里,但什么也没发生。
我还试图检查其他通知,例如“查询确实开始收集”和“查询过程”。只有“查询启动”通知才会发布。
我也有AppID与iCloud注册和权利文件附加。
你能帮我弄清楚发生了什么事吗?也许我漏掉了什么?
发布于 2011-12-10 13:10:35
通过为ivar创建NSMetadataQuery来修正。
我不知道为什么应用程序没有NSMetadataquery ivar就不能读取数据。
发布于 2011-12-01 18:21:53
首先,如果NSMetadataQuery不是从MaintThread调用的,那么startQuery就不能工作。谓词也有可能对每条路径都失败。下面的代码适用于我。
NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
...
query.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey];
[query startQuery];发布于 2011-11-29 16:11:51
不幸的是,iCloud和使用NSMetaDataQuery存在许多问题。老实说,到目前为止,所有与iCloud相关的问题最好的来源是苹果开发者论坛。今天苹果发布了iOS 5.1测试版,和的发布说明NSMetaDataQuery没有正常运行。非常令人沮丧的是,iCloud仍然没有正常工作,但遗憾的是,我们无能为力。
https://stackoverflow.com/questions/8312749
复制相似问题