0

私はまだ Core Data に慣れていないので、質問をお許しください。

私は、(簡単にするために)人々が自分自身や他の人に「挑戦」できるアプリを構築しています。ユーザーがすでに受け入れたチャレンジをローカルに保存して、オフラインで詳細を参照できるようにする必要があります。ただし、アプリがオンラインの場合、利用可能な課題、既に受け入れられている課題の新しい詳細などを表示するようにサーバーに要求しています。そのため、同期が必要になりますが、それを最小限に抑えようとしています.

今私の問題は、データをどのように構築するかです。するべきか:

(1) デバイスに格納されるデータのみのコア データ モデルを用意します。次に、サーバーから解析されているチャレンジのモデル クラスを構築し、テーブル ビューにチャレンジ オブジェクトの配列を表示するだけですか?

(2) 両方に 1 つのコア データ モデルを使用しますが、一時的な課題に対してローカルな課題をどうにかして区別しますか?

(3) 目的ごとに 1 つずつ、合計 2 つの永続ストアがありますか?

オプション 2 と 3 には明らかに NSFetchedResultsController を使用する利点がありますが、コーディングと保守がより複雑になる可能性があります。

また、同期の問題に関しては、次のことを行う必要があります。

(4) 各ローカル チャレンジが最後に更新されたときのタイムスタンプを保持し、サーバー上のタイムスタンプと照合して、新しい詳細をサーバーにプッシュする必要があるかどうかを確認します。

(5) キーパスの配列と変更を保存し、インターネット接続が再び利用可能になったら、それをサーバーにプッシュします。

これら2つの問題を解決するための最良のアプローチは何でしょうか。

どうもありがとう!

4

1 に答える 1

1

これはデザインの問題であり、常に複数のアプローチが存在するという意味で、デザインは芸術であるため、私がおそらく行うことは次のとおりです。

ローカルの課題と利用可能な課題の両方を保存するモデルを作成し、それらをいくつかのプロパティで区別します。ネットワーク接続がない場合、すべてのリモート チャレンジを除外して、キャッシュされた (または一時的な) チャレンジを表示しないようにすることもできます。接続が再開されたとき、または同期が行われたときに、サーバーまたはローカルでチャレンジを更新する必要があるかどうかを確認します。

タイムスタンプは、エンティティの変更時間を確認する良い方法です。競合を解決するためにプロパティごとの比較を行う必要がある場合は、crc32 や md5 ハッシュなどのチェックサムを使用して、バイナリ データの比較を高速化できます。

タイムスタンプを使用しても、オブジェクトが触れられた可能性がありますが、保存された値は実際には同じままであるため、オブジェクトに実際の変更が加えられたかどうかを検出するためにチェックサムを使用できます。NSKeyedArchiver を使用して、オブジェクトを NSData にシリアル化し、そのチェックサムを計算できます。このアプローチは信頼できることがわかりました。

于 2012-06-14T07:32:22.213 に答える