iCloud:如何读取用户创建的目录

Posted

技术标签:

【中文标题】iCloud:如何读取用户创建的目录【英文标题】:iCloud: How to read in directories created by the user 【发布时间】:2011-10-24 14:22:36 【问题描述】:

我想阅读用户或应用程序在 iCloud 的移动文档目录(在 Lion 中的 ~/Library/Mobile Documents 下找到的目录)中创建的所有目录的列表。这是该目录的外观示例:

我尝试了以下代码,但我运行的查询将不包含任何代表我的文件夹的对象(使用 NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey)。如果我对 txt 文件运行查询(使用 @"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey),我将分别为 txt 文件返回 5 个对象。因此,寻找 txt 文件有效,但不适用于目录。通读docs,我注意到Apple 建议使用NSFileWrapper(文件包)而不是目录。 iCloud 是否无法处理/检测用户或应用创建的目录?

这是我的代码:

-(void)loadDocument 

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
    _query = query;
    //Search all files in the Documents directories of the application’s iCloud container directories:
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey];

    [query setPredicate:pred];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
    [query startQuery];


- (void)queryDidFinishGathering:(NSNotification *)notification 

    NSMetadataQuery *query = [notification object];
    [query disableUpdates]; // You should invoke this method before iterating over query results that could change due to live updates.
    [query stopQuery]; // You would call this function to stop a query that is generating too many results to be useful but still want to access the available results.

    [self loadData:query];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query];
    _query = nil; // we're done with it



- (void)loadData:(NSMetadataQuery *)query 

   NSLog(@"Query count %i", [query resultCount]);

    for (int i=0; i < [query resultCount]; i++) 
        NSMetadataItem *item = [query resultAtIndex:i];
        NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
        NSLog(@"%i.URL: %@", i, url);
    


【问题讨论】:

【参考方案1】:

我查看了 Mac OS X Lion 中 iCloud 设置中的“管理存储”。当我单击我的应用程序时,它只会显示不同的 txt 文件(加上冲突的版本)并且没有任何目录。所以我不得不假设你只能使用包装器/文件包,但不能使用目录。

【讨论】:

你有没有解决过这个问题?值得一提的是,在 Mountain Lion 中,用户可以从应用程序内的“打开”面板创建文件夹。你试过NSMetadataQuery API吗?这应该给我们一个提示,这在 ios 中是如何变化的...... @nacho4d 不,最后我没有使用文件夹,抱歉。正如你所说,这可能会随着 M Lion 而改变。如果您找到方法,请随时通知我。 只是为了记录(因为我想你已经注意到了)我在这里发布了一个解决方法:***.com/questions/7873974/…

以上是关于iCloud:如何读取用户创建的目录的主要内容,如果未能解决你的问题,请参考以下文章

将用户默认设置保存到 iCloud

如何读取基于 iOS 文档的应用程序的保存位置(iCloud 或本地)的用户偏好?

NSFileWrapper 从 iCloud 失败并从本地目录工作

iCloud中的CoreData和照片问题[重复]

IOS沙盒Files目录说明和常用操作

如何在不将其备份到 iCloud 的情况下为我的应用程序提供演示数据?