3

私は非常に一般的な状況であると推測しますが、iOSプログラミングに慣れていないため、それをコーディングするための最適な方法がわかりません。

あらすじ:

サーバー上にRESTサービスを介してiPhoneアプリで取得できるデータがあります。サーバー側では、データは外部キー(整数ID番号)を持つオブジェクトです。

RESTを介して取得したデータをCoreDataに保存しています。管理対象オブジェクトには「objId」属性があるため、コードの残りの部分で管理対象オブジェクトを一意に識別できます。

私のアプリは常にサーバーデータを反映する必要があります。

サーバーに対して行われた後続の要求について:

  • 一部のオブジェクトは返されない可能性があります。それらはサーバー上で削除されています(その場合、対応するオブジェクトをCore Dataから削除する必要があります)。これにより、サーバーの状態が正しく反映されます。

  • 一部のオブジェクトには変更された属性があるため、対応する管理対象オブジェクトを新しいデータで更新する必要があります。

私の解決策-そしてあなたへの質問

アプリで問題を解決するために、Core Data内のすべてのオブジェクトを削除してから、最新のサーバー側データで作成されたすべての新しいオブジェクトを追加するという最も簡単なソリューションを作成しました。

これが最善のアプローチだとは思いません:)アプリを進めていくうちに、テーブルビューをNSFetchedResultsControllerにリンクしたいと思います。そして、すべてを削除して再追加するという私のアプローチがうまくいかないことに気づきました。もう働くために。

Core Dataをサーバー側のデータと同期するための実証済みの信頼できる方法は何ですか?

サーバーから取得したオブジェクトIDごとにフェッチ要求を行い、オブジェクトを新しいデータで更新する必要がありますか?

次に、コアデータ内のすべてのオブジェクトを調べて、更新されていないオブジェクトを確認し、それらを削除しますか?

それが最善の方法ですか?CoreDataのオブジェクトごとにフェッチを実行するのは少し費用がかかるようです。それだけです。

擬似コードはどんな答えにも問題ありません:)

前もって感謝します!

4

1 に答える 1

3

さて、あなたのダウンロードを検討してください。まず、これをバックグラウンドスレッドで実行する必要があります(そうでない場合は、その方法について説明しているSO投稿がたくさんあります)。

最初に意味のあるものを実装し、次に、実行中のInstrumentsから有効なパフォーマンスデータを取得した後、パフォーマンスの最適化を検討することをお勧めします。もちろん、「簡単な」パフォーマンスには常識を働かせてください(大きなものはデザインで簡単に処理できます)。

とにかく、オンラインリソースからデータを取得してから、フェッチされたオブジェクトごとに、「一意のオブジェクトID」を使用してコアデータからオブジェクトをフェッチします。そのIDを持つオブジェクトは1つしかないため、フェッチ要求でfetchLimitを1に設定できます。「オブジェクトID」属性をデータベースのINDEXとして構成することもできます。このようにして、基礎となるデータベースから最速の検索を取得し、1つのオブジェクトが見つかると検索を停止することを認識します。これはかなりきびきびしているはずです。

これでオブジェクトができました。必要な属性を変更します。保存し、すすぎ、繰り返します。

さらに、いくつかの理由から、オブジェクトが最後に更新されたのはいつかを知りたい場合があります。オブジェクトが変更されるたびに現在の時刻で変更されるタイムスタンプを各オブジェクトに追加することをお勧めします。これは、オブジェクトの削除にも役立ちます。オンラインデータベースでは削除されたオブジェクトがわからないため、アイテムが「古くて不要」であることを知る方法が必要です。

これを行う簡単な方法は、更新を開始した時刻を覚えておくことです。ダウンロードからすべてのオブジェクトを処理した後、オンラインデータベースから削除されたすべてのオブジェクトを見つける方法があります。基本的に、更新を開始する前に「最終更新」タイムスタンプを持つオブジェクトはすべて削除する必要があります(最後の更新で追加または変更されていないため)。このフィールドでデータベースにインデックスを付けることもできます。これにより、これらのオブジェクトをすばやく見つけることができます。データベースが巨大でない限り、Instrumentsがこのオブジェクトについて何を言っているかを確認するのを待ちます。

于 2012-05-08T13:31:19.887 に答える