NSMetadataQuery找不到iCloud文件

时间:2011-10-31 07:08:57

标签: objective-c cocoa icloud

我按照Apple Docs NSMetadataQuery中的描述使用来搜索我的iCloud文件。我只有一个文件,我知道它的名字。我的问题是,有时这个文件不存在(我想因为它还没有下载),NSMetadataQuery无法找到它。

曾试图强制下载NSFileManager startDownloadingUbiquitousItemAtURL:error:并且它返回一个错误。 (阅读编辑)

我的解决方案是我第一次创建文件,然后我猜它存在,我用UIDocument打开它。但它可能不存在,或者可能是用户第一次打开应用程序。我无法确定这些事情。我的第一个问题是:如果UIDocument打开文件,则意味着它在某个地方找到了该文件。如果它不存在,它怎么能使用该文件?

然后,第二个问题:如果我的应用程序必须管理多个文件或名称未知的文件。如果NSMetadataQuery不起作用,我怎样才能找到它们。

修改 如果startDownloadingUbiquitousItemAtURL应该用于开始下载文件,我怎么知道文件何时完成下载(可能带有通知)?但是,更重要的是:如果总是说(删除原始名称),我如何下载文件?

   Error Domain=NSPOSIXErrorDomain Code=2 "The operation couldn’t be completed.
    No such file or directory" UserInfo=0x166cb0 {
    NSDescription=Unable to get real path for Path
'/private/var/mobile/Library/Mobile Documents/teamid~com~team~app/Documents/file.extension'
    }

3 个答案:

答案 0 :(得分:7)

我建议iCloud文件的以下加载例程。它涉及4个步骤:

  1. 首先,测试iCloud是否可访问
  2. 然后查找您的文件(查找您指定的特定文件或查找具有特定扩展名的所有文件,如* .txt,或者如果您不知道要查找的文件扩展名,请查找{ {1}}将返回所有具有扩展名的文件,如jpg,txt,dat等。)
  3. 然后检查查询是否完成,
  4. 最后尝试加载文件。如果该文件不存在,请创建它。如果确实存在,请加载它。
  5. 这是代表这四个步骤的代码:

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

答案 1 :(得分:1)

edo42,你解决了这个问题吗?我已经购买了一台新的4S回到AT& T,我已经备份了我的第一台4S,然后在新的4S上从备份中恢复,然后这种情况发生在我身上。

  1. 当我执行[iCloudFileURL getResource:& fileState forKey:NSURLIsUbiquitousItemKey错误:& error]时,我收到同样的错误。
  2. 错误Domain = NSPOSIXErrorDomain Code = 2“操作无法完成。没有这样的文件或目录”UserInfo = 0x448500 {NSDescription =无法获取路径的真实路径'/ private / var / mobile / Library / Mobile Documents /~UbiquitousDir~/Documents/MyDocument.ext'

    (在iPad 2上正常工作)

    1. 然后我会做NSMetadataQuery,但后来又没有结果。 (在iPad 2上工作就可以在iCloud上查看文档了。)

    2. 我检查了无处不在的文件是否存在,但错误表明它不存在。

    3. 我尝试使用[fileMgr evictUbiquitousItemAtURL:ubiquitousDocumentsDir& error],但确实成功了。但是当我尝试使用NSMetadataQuery时,它仍然没有结果。

    4. 希望这有助于找出两种情况下的错误。

      更新:好的,我从备份恢复的iCloud存在真正的问题:

      1. 我已从iPhone设备删除了我的应用。
      2. 我从“管理存储”中删除了应用的备份文件。
      3. 我甚至从托管存储下的iCloud(文档和数据)中删除了我的应用程序的文件。
      4. iCloud文件不再存在,我在iPad 2上查看它已经消失了。
      5. 我在iPad 2上启动了我的应用程序,并成功保存了新的iCloud文档。
      6. 新的iCloud文件显示在我的iPhone上。
      7. 我在我的设备上构建并运行我的应用程序,但他无法使用NSMetadaQuery查询下载该文件。

答案 2 :(得分:0)

我有类似的问题,metadataQueryDidUpdate和metadataQueryDidFinishGathering会触发,但NSMetadataQuery的结果将为空。有一个配置文件问题,Xcode没有告诉我,直到我试图在我的设备上测试它,它失败了,说我的包标识符无效(它不是)。

为我修复的是进入“首选项”并单击“配置”配置文件的“全部下载”按钮,然后在Xcode中执行“清理”。重建,运行,我的所有文件都出现了。检查开发人员门户,确保没有任何配置文件标记为无效。我没有一个,所以它不需要触发它,但它可能会发生。

不完全科学,但这对我有用。