0

iCloud を使用して、デバイス間の同期ユーザー設定を保存しています。デバイスでは、これらは の「お気に入りのチーム」の配列に保存され、MKiCloudSyncNSUserDefaultsを使用してそれらを にミラーリングしています。1 つのデバイスでの変更が、2 番目のデバイスにうまく伝播しています。NSUbiquitousKeyValueStore

しかし、新規インストール後の最初の起動時にクラウド データが消去されないようにする方法がわかりません。何が起こっているかは次のとおりです。

  1. デバイス A が初めて起動します。アプリはクラウドで何も検出しません。ユーザーは、NSUserDefaults の配列に複数の項目を追加します。変更はすぐにクラウドに同期されます。
  2. デバイス B は初めて起動しますが、オフラインです。ユーザーが配列に 1 つのアイテムを追加するとNSUserDefaults、アプリが iCloud をサポートしていることを覚えているので、代わりに Wi-Fi を見つけます。
  3. デバイス B は、そのバージョンのデフォルトをクラウドにプッシュします (アイテムは 1 つだけ)。デバイス A はそれをプルし、デバイス A に追加されたすべてのチームを事実上一掃します。

これはiCloudの制限ですか、それとも私の実装は単純ですか? ドキュメントは、「最高レベル」が同期される同様の問題に対処し、この値を小さい値で上書きしないようにアプリケーション ロジックを追加します。従うべき明確なビジネス ロジックがある場合は問題ありませんが (より高いレベルは常に保持する必要があります)、データがより恣意的である場合、何をすべきかを判断する方法がわかりません。

それとも、「お気に入りのチーム」の NSUserDefaults で配列を使用していて、それを大規模に置き換えているためですか? チームごとに別々のキーを使用した場合、タイム コードに基づいて個別に同期されるのでしょうか?

4

1 に答える 1

1

特定のキーの値を同期するときはいつでも、同じアカウントを使用する別のデバイスによって値が変更されるリスクがあります。iCloud サービスは、あなたに最適な値を選択し、更新を行い、完了したら通知します。これは iCloud とアプリの制限であり、同期が難しい理由の簡単な例です。上記のステップ 2 が次のようになったとします。

デバイス B が初めて起動し、iCloud が利用可能になります。アプリはデバイス A から現在のデータをダウンロードします。ユーザーは考えを変えて、デバイス A で作成したすべてのデータを削除します。その後、1 つの新しいアイテムが作成されます。

じゃあどうする?ステップ 3 は、説明したとおりに行われますが、今回は着信データがユーザーが必要としているものです。データをリファクタリングすることはできますが、同じような状況が発生する可能性があります。

1 つのオプションは、同期していないデータのローカル コピーを保持することです。これにより、受信した変更を以前のローカル状態と比較できます。それらが異なる場合にどうするかはあなた次第です。劇的な変更であっても、ユーザーが望んでいるものであり、修正が必要な同期の問題ではない可能性があることを忘れないでください. または、ユーザーが保持したいデータを失う可能性があります。この対立を解決するのはあなたの仕事です。

于 2013-06-17T18:08:41.840 に答える