コアデータとJSONの質問
-
01-10-2019 - |
質問
私はこの質問が以前にあることを知っていますが、説明は私にとって少し不明確でした、私の質問はもう少し一般的です。リモートWebサービスを使用して、iPhoneアプリのデータを定期的に更新する方法を概念化しようとしています。理論的には、電話のデータの一部は定期的に同期されます(更新された場合のみ)。他のデータでは、ユーザーがオンラインであり、その場で要求される必要があります。
概念的には、これはXML-RPCまたはJSONおよびコアデータを使用して可能であると思われます。誰かがこれを実装する最良の方法について意見を持っているのだろうか、私は初心者のiPhone開発者ですが、概念的にプロセスの多くを理解しています。
ありがとう
解決
サーバーを制御できないときにエンティティのセットを同期するには、次のアプローチを次に示します。
Aを追加します
touched
エンティティの説明へのbool属性。同期の試みでは、すべてのエンティティインスタンスを手つかずのようにマークします(
touched = [NSNumber numberWithBool:NO]
).サーバー側(JSON)インスタンスをループして、コアデータストアからサーバー側のストア、またはその逆にエンティティを追加または更新します。更新の方向は、同期ポリシーと、どちらの側でも「新鮮」なデータに依存します。いずれにせよ、マークは触れたようにコアデータエンティティを追加、更新、または同期しました(
touched = [NSNumber numberWithBool:YES]
)同期ポリシーに応じて、まだ触れられていないコアデータストアからすべてのエンティティインスタンスを削除します。 Core Data Storeとそれらのオブジェクトのサーバーの間で追加、更新、同期イベントが行われなかったため、おそらくサーバー側のストアから手つかずのエンティティが削除されたと思われます。
同期は、実装するためのかなりの量の作業であり、サポートする必要がある同期の程度に依存します。データを引いているだけの場合、ステップ3はオブジェクトの更新をサーバーにプッシュする必要がないため、かなり簡単です。
他のヒント
同期は硬く、非常に難しいです。理想的には、サーバーから変更のデルタを受信し、コアデータの各レコードに対して一意のIDを使用して、新規または変更されたレコードのみを更新することをお勧めします。
それができると仮定すると、コードはかなり簡単です。両方向に同期している場合、両側のデルタを追跡して衝突を処理する必要があるため、事態はより複雑になります。
どのようなタイプの同期を達成したいかを明確にすることができますか?双方向ですか、それともプルだけですか?
答えがありますが、それはひどいです。私は現在、より受け入れやすい/信頼できるソリューションを探しています(つまり、マーカス・ザラが料理するものは何でも)。
私がやったことはいくつかの仕事が必要です...真剣に、それはいつもうまくいかないからです...
モバイルデバイスには、エンティティのJSONカタログ、そのバージョン、およびエンティティコンテンツを含むJSONファイルを指すURLがあります。
サーバーには同じセットアップがあり、カタログはエンティティをリストします。
モバイルデバイスが起動するたびに、ローカルカタログのエンティティバージョンをサーバー上のカタログと比較します。サーバー上のこれらのバージョンのいずれかが新しい場合、ユーザーにエンティティの更新をダウンロードする機会を提供します。
ユーザーが更新することを選択すると、モバイルデバイスには、新しい/変更されたエンティティごとにURLがあり、ダウンロードします。ダウンロードすると、アプリは変更されたエンティティごとにすべてのオブジェクトを吹き飛ばし、JSONから新しいオブジェクトを挿入します。エラーが発生した場合、削除/挿入はプレップデート前のステータスに戻ります。
これは、ある種の機能です。デバッグセッションが不幸になったときにそれをキャッチすることはできないので、その過程で腐敗や矛盾を引き起こす可能性があるのはわかりません。