首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将iCloud文件复制到沙箱

将iCloud文件复制到沙箱
EN

Stack Overflow用户
提问于 2014-04-09 06:11:13
回答 3查看 2.8K关注 0票数 0

我正在寻找一种更好的方法从我的iCloud容器下载一堆文件到我的沙箱。这是我目前使用的:

代码语言:javascript
复制
for (FileAttachments *fileLink in items) {
        NSURL *cloudFileURL = [fileLink urlForCloudAttachmentWithName];

        NSURL *fileURL = [backupCloudLocalDirectoryURL URLByAppendingPathComponent: fileLink.fileName];

        NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];

        [fileCoordinator coordinateReadingItemAtURL:fileURL options:NSFileCoordinatorReadingWithoutChanges error:&error

                                             byAccessor:^(NSURL *newURL) {

                   NSError *blockError = nil;

                   [fileManager copyItemAtURL:cloudFileURL toURL:fileURL error:&blockError];
                                }];
        }
}

用这种方式复制iCloud项目有问题吗?在生产中,我有一些用户抱怨他们所有的文件都没有下载。用NSFileManager's startDownloadingUbiquitousItemAtURL:error代替好吗?如果是,为什么?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-11 18:59:51

从评论中我仍然不完全清楚您是如何发现URL的,但是一些影响您的情况的重要细节是:

  1. 使用coordinateReadingItemAtURL:block:与从iCloud下载文件无关。NSFileCoordinator的目的是在文件的读取器和作者之间进行协调,这样就不会有两个线程试图同时写入同一个文件。您可以在iCloud中使用文件协调器,因为iCloud系统需要读写文件,应用程序也是如此。使用协调器可以避免损坏文件,但与下载文件无关。
  2. 要从iCloud下载文件,您需要使用startDownloadingUbiquitousItemAtURL:error:,然后等待文件下载。这里的正常流动是: 使用NSMetadataQuery查找iCloud帐户中存在的文件。 使用startDownloadingUbiquitousItemAtURL:error:确保它们在本地设备上可用。 您需要使用此调用的原因很简单,因为这就是iCloud在iOS上的工作方式。除非你让文件下载,否则文件是不会下载的,这就是你要问的。在OS上它是不同的,所有的东西都会自动下载。
  3. 除非您已经知道文件已经下载,否则不能简单地从iCloud URL复制到另一个位置。文件复制操作不会下载文件,因此如果文件在本地不可用,则复制将失败。
票数 12
EN

Stack Overflow用户

发布于 2014-04-11 10:08:37

您必须使用元数据查询来标识文件及其下载状态,如果这些文件尚未下载,则启动下载,并使用元数据查询确定下载完成时间,然后使用文件协调器将文件从ubiquity容器复制到应用程序沙箱目录。如果尝试在文件部分下载时复制该文件,您可能会得到一些奇怪的结果。

票数 0
EN

Stack Overflow用户

发布于 2014-04-15 16:57:06

我和你也有同样的问题。

我的例子是:当网络断开时,iCloud服务将文件从iCloud容器复制到沙箱。执行此行时,它无法进入块复制文件。这就是为什么不能复制此文件的原因。

:options:NSFileCoordinatorReadingWithoutChanges fileCoordinator错误:&error byAccessor:^(NSURL *newURL)

我的解决方案是:在将文件从iCLoud容器复制到沙箱之前,必须检查网络。如果它不可用,请不要执行此代码(返回方法)。如果网络连接,执行fileCoordinator并复制。

更多信息:当将文件从ICloud容器复制到沙箱时,fileManager copyItemAtURL:toURL:error:是可以的,因为我实现了这个方法,它很好。

希望这能行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22954215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档