0

iCloud が無効になっている場合でも、ユーザーがコア データ ストアを通常どおり使用し続けられるようにしたいと考えています。私が抱えている唯一の問題は、有効にしたときにログを生成した大量のデータがある可能性があることです。その後、再度有効にすると、それ以降に作成したすべてのデータを追加しないか、すべてのデータを追加して、既存のデータを複製します。この問題を回避するために、iCloud が無効になっているときにログを作成し続けたいので、iCloud が再び有効になったときにそれらの変更をアップロードすることができます。

これは、iCloud に接続するときに実行する必要があるコードです。

NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];

NSMutableDictionary *options = [NSMutableDictionary dictionary];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
        [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
        [options setObject:iCloudEnabledAppID            forKey:NSPersistentStoreUbiquitousContentNameKey];
        [options setObject:iCloudLogsPath                forKey:NSPersistentStoreUbiquitousContentURLKey];

[psc addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:store
                                options:options
                                  error:nil];
4

1 に答える 1

2

残念ながら、これはオプションではありません。iCloud が有効を使用するNSPersistentStoreUbiquitousContentNameKeyと、Core Data トランザクション ログが自動的に作成されます。それ以外の場合、トランザクション ログは作成されません。iCloud を有効にせずに、コードで強制的にログを作成する方法はありません。この種の状況は、Core Data で iCloud を使用しようとする際に発生する多くの予想外の問題の 1 つにすぎません。

考えられるアプローチの 1 つ: iCloud が有効になっていることがわかったら、データ ストア全体を iCloud に移行します。次に、重複検出方法を使用して重複エントリを除外します。SharedCoreDataApple は、 WWDC 2012 セッション 227、Using iCloud with Core Dataで説明されているサンプル プロジェクトで重複検出コードの良い例を提供しました。

もう 1 つの方法は、iCloud が無効になっている間、独自の変更ログを維持することです。NSManagedObjectContextDidSaveNotification変更を監視し、iCloud が無効になっている間に変更されたオブジェクトの独自のリストを保持するために使用します。iCloud が再度有効になっている場合は、それらのオブジェクトを再保存して、それらの iCloud トランザクションを生成できます。

ただし、これらのいずれかを使用すると、考慮すべき関連する複雑さがいくつかあります。

  1. アプリの実行中にユーザーが iCloud を無効にすると、既存の永続ストア コーディネーターや既存のデータ ストアを引き続き使用することはできません。その場合、アプリはトランザクション ログの書き込みを試みますが、保存する場所がないために失敗し、その後クラッシュします。iCloud 以外の新しいデータ ストアに移動する必要があります。おそらくmigratePersistentStore:toURL:options:withType:error:これを 1 ステップで実行できますが、実行する必要があります。(余談ですが、データ ストアのメタデータをいじることは可能かもしれませんが、これは文書化されておらず、どのキーを消去すればよいかわかりません)。

  2. 上記に関連して、ユーザーが iCloud を再度有効にした場合は、iCloud 対応のデータ ストアに戻す必要があります。

  3. アプリの起動時に iCloud が有効になっていない場合はnil、永続的なストア コーディネーターをセットアップするときにオプションを使用する必要があります。によって返された値を確認し、URLForUbiquityContainerIdentifier:それに応じて iCloud の有無にかかわらず続行します。

  4. 私の経験では、iCloud を使用した Core Data は不安定です。特に、からの戻り値を確認するようにしてください。これは、明らかに理由がはっきりしないために失敗する可能性があるためです (つまり、すべてを正しく行ったのに、iCloud が動作していないなど) addPersistentStoreWithType:etc

頑張ってください、あなたはそれを必要とするでしょう。今日の時点で、Apple でさえ自社のアプリで Core Data を使用した iCloud を使用していないことに注意してください。

于 2012-12-11T17:25:59.863 に答える