0

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代わりに使ったほうがいいですか?もしそうなら、なぜですか?ありがとう。

4

3 に答える 3

12

URL をどのように見つけているのかコメントからはまだ完全にはわかりませんが、状況に影響を与えるいくつかの重要な詳細は次のとおりです。

  1. 使用coordinateReadingItemAtURL:block:は、iCloud からファイルをダウンロードすることとは関係ありません。の目的はNSFileCoordinator、たとえば、2 つのスレッドが同時に同じファイルに書き込もうとすることがないように、ファイルのリーダーとライターの間で調整することです。iCloud システムはファイルの読み取りと書き込みを行う必要があり、アプリも同様であるため、iCloud でファイル コーディネータを使用します。コーディネーターを使用すると、ファイルの破損を回避できますが、ファイルのダウンロードとは関係ありません。

  2. iCloud からファイルをダウンロードするには、使用する必要がありstartDownloadingUbiquitousItemAtURL:error:、ファイルがダウンロードされるまで待ちます。ここでの通常の流れは次のとおりです。

    を。NSMetadataQueryiCloud アカウントに存在するファイルを検索するために使用します

    b. startDownloadingUbiquitousItemAtURL:error:ローカル デバイスで使用できることを確認するために使用します。

    この呼び出しを使用する必要がある理由は、iCloud が iOS でどのように機能するかという単純な理由です。ファイルは、ダウンロードするように要求するまでダウンロードされません。これが、要求する方法です。[OS X では異なります。すべてが自動的にダウンロードされます。]

  3. ファイルがダウンロードされていることがわかっていない限り、iCloud URL から別の場所に単純にコピーすることはできません。ファイル コピー操作ではファイルがダウンロードされないため、ファイルがローカルで利用できない場合、コピーは失敗します。

于 2014-04-11T18:59:51.533 に答える
0

私はあなたと同じ問題を抱えていました。

私の場合は次のとおりです。ネットワークが切断されると、iCloud サービスはファイルを iCloud コンテナーからサンドボックスにコピーします。この行が実行されると、ファイルをコピーするブロックに入ることができません。これが、このファイルをコピーできない理由です。

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

私の解決策は次のとおりです。iCLoud コンテナーからサンドボックスにファイルをコピーする前に、ネットワークを確認する必要があります。利用できない場合は、このコードを実行しないでください (return メソッド)。ネットワークが接続されたら、fileCoordinator を実行してコピーします。

詳細: iCloud コンテナからサンドボックスにファイルをコピーする場合、メソッド fileManager copyItemAtURL:toURL:error: は問題ありません。

これがうまくいくことを願っています。

于 2014-04-15T16:57:06.930 に答える
0

メタデータ クエリを使用してファイルとそのダウンロード ステータスを特定し、ダウンロードされていない場合はダウンロードを開始し、メタデータ クエリを使用してダウンロードの完了時期を判断し、ファイルをユビキタス コンテナからアプリ サンドボックスにコピーする必要があります。ファイルコーディネーターを使用してディレクトリ。ファイルが部分的にダウンロードされている間にファイルをコピーしようとすると、奇妙な結果が生じる場合があります。

于 2014-04-11T10:08:37.007 に答える