将iCloud文件复制到沙箱

时间:2014-04-09 06:11:13

标签: ios icloud nsfilemanager nsfilecoordinator

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

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?如果是这样,为什么? 谢谢。

3 个答案:

答案 0 :(得分:8)

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

  1. 使用coordinateReadingItemAtURL:block: nothing 与从iCloud下载文件有关。 NSFileCoordinator的目的是协调文件的读者和编写者,例如,您不会让两个线程同时尝试写入同一个文件。您使用iCloud的文件协调器,因为iCloud系统需要读取和写入文件,您的应用程序也是如此。使用协调器可以避免破坏文件,但是再次与下载文件无关。

  2. 要从iCloud下载文件,您需要使用startDownloadingUbiquitousItemAtURL:error:,然后等待文件下载。这里的正常流程是:

    一个。使用NSMetadataQuery查找iCloud帐户中存在的文件

    湾使用startDownloadingUbiquitousItemAtURL:error:确保它们在本地设备上可用。

    您需要使用此通话的原因仅仅是因为iCloud在iOS上的运作方式。在您要求下载文件之前,文件不会下载,这就是您的要求。 [在OS X上它不同,一切都会自动下载。]

  3. 除非您已经知道该文件已下载,否则您无法简单地从iCloud网址复制到其他位置。文件复制操作不会下载文件,因此如果文件在本地不可用,则副本将失败。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我遇到了同样的问题。

我的情况是:当网络断开连接时,iCloud服务将文件从iCloud容器复制到沙箱。当该行执行时,它不能进入​​块复制文件。这就是无法复制此文件的原因。

fileCoordinator coordinateReadingItemAtURL:fileURL options:NSFileCoordinatorReadingWithoutChanges error:&error byAccessor:^(NSURL *newURL)

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

更多信息:将文件从IClo​​ud容器复制到沙箱时,方法fileManager copyItemAtURL:toURL:错误:没问题,因为我实现了这个方法,这很好。

希望这有效。