NSMetadataQuery无法完成收集(无通知)

aka*_*kyy 5 iphone ios5 icloud nsmetadataquery

我正在为我的应用程序(通过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];
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是- (void)queryDidFinishGathering:(NSNotification *)notif永远不会执行.我把breakpints和NSLogs放在那里但没有任何事情发生.

我还尝试检查其他通知,例如"查询确实开始收集"和"查询过程".仅发布'query did start'通知.

我还附带了iCloud注册和授权文件的AppID.

你能帮我解决一下发生的事吗?也许我错过了什么?

小智 17

首先,如果不是从MaintThread调用startQuery,则NSMetadataQuery不起作用.每个路径都有可能出现谓词失败.以下代码适合我.

NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
...
query.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey];
[query startQuery];
Run Code Online (Sandbox Code Playgroud)


aka*_*kyy 9

通过创建ivar来固定NSMetadataQuery.

我不知道为什么没有NSMetadataquery ivar,应用程序无法读取数据.

  • 如果您使用ARC,则在范围结束后,您的NSMetaDataQuery将被取消分配.你需要一个iVar来保留它 (4认同)