私は最初の「iCloud アプリ」に取り組んでいます。Apple のドキュメントとスタンフォードのビデオに取り組みましたが、iCloud の「全体像」を理解するのにまだ苦労しています。
私の目標は、従業員の例のような「ライブラリ スタイル」アプリ (「単一の永続ストア コーディネーターと単一の永続ストアを備えた単一のコア データ スタック」を備えたアプリの Apple 用語) を作成することです。
スタンフォードのビデオに続いて、UIManagedDocument を使用してすべての Core Data をセットアップし、iCloud 機能を有効にしています。UIManagedDocument にはデータベースが含まれており、「クラウドに保存」されています。
これはすでに私が苦労している最初のことです: 「クラウドに保存される」とはどういう意味ですか?
iCloud を使い始める前は、「ドキュメントをクラウドに保存する」とは「ドキュメントのコピーをクラウドに保存する」ことだと思っていました。私は、ドキュメントのローカル バージョンが通常のサンドボックス内にあり、ドキュメントのコピーがクラウドにあると考えていました。ローカル ドキュメントが変更されるたびに、これらの変更はクラウド バージョンにも転送されます。私が理解しているように、これは正しくありません (少なくとも完全には正しくありません)。私は正しいですか?
iCloud を使用するために最初にしなければならないことは、URLForUbiquityContainerIdentifier:を呼び出すことです。これにより、クラウド内のフォルダーの URL を意味する「iCloud URL」が返されます。このURLに保存されているファイルはすべて「クラウドに保存」されますよね?
私の最初の仮定 (ローカル ファイル + クラウド内のコピー) は完全に間違っているわけではありません。実際、クラウドに保存されているファイルには「ローカル バージョン」と「クラウド バージョン」があります。これは、デバイスが現在インターネットに接続されていない場合でも、iCloud URL にアクセスしてこの場所にファイルを保存できるためです。しかし、これは iCloud フレームワークの魔法の背後にあるだけであり、私が気にする必要はありません。私の観点からすると、クラウドは単純な特別なフォルダーであり、このフォルダー内のファイルまたはディレクトリはすべてクラウドに保存されます。iCloud がデバイス設定で無効になっている場合、iCloud URL は NIL になります。そうですか?
私が苦労している 2 番目のことは、iCloud がドキュメントへの変更を同期する方法です。デバイス A の「TheApp」が UIManagedDocument を作成し、クラウドに保存するとします。その後、デバイス A はオフラインになります。一方、ドキュメントはデバイス B の TheApp によってアクセスされ、一部のデータが追加されます (たとえば、一部の新しい従業員または部門が挿入されます)。デバイス B が再びオンラインになると、NSPersistentStoreDidImportUbiquitousContentChangesNotificationを受信し、ドキュメントの managedObjectContext ですべての呼び出しmergeChangesFromContextDidSaveNotification:をマージして、これらの変更をコピーできます。
変更をマージすることが本当に必要かどうかを確認できませんでした。上記のように、私の観点からは、ドキュメントは 1 つしかありません。それが本当なら、変更について通知されるのは素晴らしいことですが、「ローカル バージョン」などは存在しないため、これらの変更をドキュメントの「ローカル バージョン」にコピーする必要はありません。これにより、mergeChangesFromContextDidSaveNotification: が何に適しているのかという疑問が生じます。
別のシナリオは、以前と同じ状況 (デバイス A で作成されたドキュメント、デバイス B で変更された...) ですが、デバイス A は単にオフラインではなく、デバイス B で変更が行われている間に TheApp が完全にシャットダウンされました。その場合、TheAppデバイス A では、ドキュメントを再度起動した後、ドキュメントを再作成/再度開く必要があります。この場合、どうすればよいでしょうか?
いくつかのテストを実行しましたが、結果は常に同じではありませんでした。場合によっては、ドキュメントが「古い」バージョンで開始され、その後変更の通知を受け取りました。それ以外の場合、ドキュメントはすべての変更が反映された新しいバージョンで直接開始されました。私のアプリでは、最初のケース (古いバージョンで開始し、更新通知を受け取る) の方が適していますが、いずれかの動作を強制することはできませんでした。これは機能するはずでしたか?
どうもありがとうございました!