8

私はiCloudのアイデアに少し苦労しており、より一般的な質問をここに投稿しました。私の最大の問題は、アプリのサンドボックスにある古き良きドキュメント フォルダーにユーザーのデータを配置するのをやめるべきかどうかを決定することです。私の問題を説明するには:

ここに画像の説明を入力

私が見る限り、ドキュメントは答えを出していませんさまざまな txt ファイルを処理するアプリがあるとします。アプリを起動したら、次のように txt ファイルがクラウドにあるかどうかを確認するだけです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"AppDelegate: app did finish launching");
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    // (1) iCloud: init

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        NSLog(@"User has iCloud enabled! Let's get the txt files from the cloud.");
        [self loadDocument];
    } else {
        NSLog(@"User doesn't have iCloud enabled. App is thus worthless.");
    }


    return YES;
}

次に、クラウドに txt ファイルがあるかどうかを確認し、ある場合はそれらをロードする方法があります。そうでない場合は、クラウドに新しい txt ファイルを作成するだけです。

これは、アプリがドキュメント フォルダーにデータを保存しないことを意味します。私が理解している限り、すべてが私のデバイスのローカル iCloud ストレージ (ユーザーがオフラインの場合にもアクセス可能) またはクラウドのいずれかにあります。つまり、テキスト ファイルはデバイスとクラウドの 2 つの場所に存在します。

つまり、ローカルのドキュメント フォルダに 3 つ目のコピーを保存する必要はありませんよね? それとも、これは私が見落とした何らかの理由で不可欠ですか? つまり、iCloud をユーザーに提供する場合、ローカルのドキュメント フォルダを何に使用すればよいのでしょうか? (そして、iCloud にサインアップしない人を単純に無視できますか?)


編集: 明確にするために、アプリのサンドボックス内の標準ドキュメント フォルダーについて話しているときは、次のことを意味します。

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
4

3 に答える 3

3

おそらく、ドキュメントを 4 回目または 5 回目に読み直すことで、少し遅いかもしれませんが、常にサンドボックスでファイルを作成してからクラウドに移動する必要があることを示唆するこれに出くわしました。したがって、ある意味で、Apple は常に同じファイルの 3 つのバージョンを保持することを提案しています。

アプリは、ローカルのファイルやディレクトリに対して行うのと同じテクノロジを使用して、iCloud のファイルやディレクトリを管理します。iCloud のファイルとディレクトリは、依然として単なるファイルとディレクトリです。開いたり、作成したり、移動したり、コピーしたり、読み書きしたり、削除したり、その他の必要な操作を行うことができます。ローカルのファイルとディレクトリと iCloud のファイルとディレクトリの唯一の違いは、それらへのアクセスに使用する URL です。アプリのサンドボックスに相対する URL ではなく、iCloud ファイルとディレクトリの URL は、対応する iCloud コンテナー ディレクトリに相対します。

ファイルまたはディレクトリを iCloud に移動するには:

アプリ サンドボックスでファイルまたはディレクトリをローカルに作成します。使用中、ファイルまたはディレクトリは、UIDocument オブジェクトなどのファイル プレゼンターによって管理される必要があります。

URLForUbiquityContainerIdentifier: メソッドを使用して、アイテムを保存する iCloud コンテナー ディレクトリの URL を取得します。コンテナー ディレクトリの URL を使用して、iCloud 内のアイテムの場所を指定する新しい URL を作成します。NSFileManager の setUbiquitous:itemAtURL:destinationURL:error: メソッドを呼び出して、項目を iCloud に移動します。アプリのメイン スレッドからこのメソッドを呼び出さないでください。これを行うと、メイン スレッドが長時間ブロックされたり、アプリ独自のファイル プレゼンターの 1 つでデッドロックが発生したりする可能性があります。ファイルまたはディレクトリを iCloud に移動すると、システムはその項目をアプリ サンドボックスからプライベート ローカル ディレクトリにコピーして、iCloud デーモンで監視できるようにします。ファイルがサンドボックスに存在しなくなっても、アプリは引き続きファイルに完全にアクセスできます。ファイルのコピーは現在のデバイスに対してローカルのままですが、他のデバイスに配布できるように、ファイルは iCloud にも送信されます。iCloud デーモンは、ローカル コピーが同じであることを確認するすべての作業を処理します。したがって、アプリの観点からは、ファイルは iCloud にあるだけです。

iCloud のファイルまたはディレクトリに加えるすべての変更は、ファイル コーディネーター オブジェクトを使用して行う必要があります。これらの変更には、アイテムの移動、削除、コピー、または名前の変更が含まれます。ファイル コーディネータは、iCloud デーモンがファイルまたはディレクトリを同時に変更しないようにし、変更内容が他の関係者に通知されるようにします。

こちらをご覧ください。

于 2011-10-24T08:42:22.230 に答える