9

大量のXMLをRESTfulサービスからCoreDataストアに非同期的にプルし、このストアからUITableViewオンザフライでデータを取り込むためのグッドプラクティスは何ですか?

libxml2のxmlParseChunk()関数を使用して、着信XMLのチャンクを解析し、ノードが着信したときにノードとその子を関連する管理対象オブジェクトに変換することを考えています。

これらのXMLノードが管理対象オブジェクトに変換されると同時に、UITableView行を生成したいと思います。たとえば、一度に50行です。これは現実的ですか?

あなたの経験では、このタスクを実行し、パフォーマンスを維持し、場合によっては数千行を処理するために何をしますか?うまく機能する、またはそれ以上に機能する、異なる、より単純なアプローチはありますか?

4

3 に答える 3

14

確かに、これはかなり標準的なことです。最も簡単な解決策は、1 つの MOC のバックグラウンド スレッドで読み込みを行い、独自の MOC を使用してメイン スレッドで UI を実行することです。表示したいデータのチャンク (たとえば 50 エントリ) を取得するたびに、バックグラウンド MOC がありますsave:

フォアグラウンド MOC が ( 経由でmergeChangesFromContextDidSaveNotification:) 変更をマージするようにリグされていると仮定すると、バックグラウンド MOC を保存するたびに、フォアグラウンド MOC がそれらのすべての変更を取得します。NSFetchedResultsController を使用していると仮定すると、MOC の変更に対処するためのデリゲート メソッドがあり、Apple のサンプル コードを使用している場合は、すべてが正しくセットアップされている可能性があります。

一般に、CoreData は、自分が何をしているのかを本当に理解しており、特定のケースに合わせて多くの時間を費やしても構わないと思っている場合を除き、自分でロールバックするものよりも高速になります。あなたができる最大のことは、遅いもの (XML 処理や によって引き起こされる同期フラッシュ I/O などsave:) がメイン スレッド上でユーザーの操作をブロックしないようにすることです。

于 2009-10-06T07:24:02.523 に答える
2

Joe Hewitt (Facebook アプリ開発者) は、彼のコードの多くをオープンソースとしてリリースしています。スリー20といいます。事前にデータを必要とせずに、インターネット データを取得してテーブルに入力するのに最適なクラスがあります。これに使用されるクラスはTTTableViewControllerおよびTTTableViewDataSourceと呼ばれます。

ここからは、CoreData として保存するのは大したことではなく、提供されたフックに適合するようにクラスをサブクラス化するだけです。

データが多すぎることを心配している場合は、一度に 50 が妥当に思えます。これらのクラスには、役立つ「詳細」ボタンが組み込まれています。

Three20 の readme から:

インターネット対応のテーブル ビュー コントローラー
である TTTableViewController と TTTableViewDataSource は、インターネットからコンテンツを読み込むテーブルを作成するのに役立ちます。UITableView がデフォルトで行うように、すべてのデータが準備できていると仮定するのではなく、TTTableViewController を使用すると、データがロードされているとき、エラーが発生したとき、または表示するものが何もないときに通信できます。また、データの次のページをロードするための「More」ボタンを追加するのにも役立ち、オプションで、デバイスを振ってデータをリロードすることもサポートします。

于 2009-10-03T00:58:47.020 に答える
0

RestKitについてはまだ誰も言及していませんか?私の友達...真剣に、あなたはこれをチェックしなければなりません。iOS(および現在はOS X)でRESTを使用して何かをしている場合、特にCore Dataを使用したい場合は、RestKitをご覧ください。サーバーとiOS上のコアデータモデルとの間にかなり複雑なデータ同期を実装することで、数え切れないほどの時間を節約できました。RestKitはそれをとても簡単にしました、それはほとんどあなたを病気にします。

于 2011-03-27T04:20:58.307 に答える