2009-09-29 10 views
9

大量のXMLをRESTfulサービスからコアデータストアに非同期にプルし、このストアからUITableViewをオンザフライで実装するための良い方法は何ですか?RESTの良い戦略 - > XML - >コアデータ - > UITableView?

のノードが入って来て、私は、受信したXMLのチャンクを解析し、関連する管理対象オブジェクトにノードとその子を翻訳するのlibxml2のxmlParseChunk()機能を使用して考えています。

を同時にこれらのXMLノードであること管理オブジェクトに変換された場合、私は順番にUITableViewの行を生成したい。一度に50行ずつ言いましょう。これは現実的ですか?

あなたの経験では、パフォーマンスを維持し、潜在的に何千もの行を処理するために、このタスクを達成するために何をしていますか?違う、より簡単なアプローチがうまくいったり、それ以上に優れていますか?

+1

あなたはhttp://cocoawithlove.com/2009/09/optimizing-loading-of-very-large-table.htmlが役立つかもしれません。 –

答えて

14

確かに、これはかなり標準的なことです。最も簡単な解決策は、1つのMOCのバックグラウンドスレッドでロードを行い、UIを独自のMOCでメインスレッド上で実行させることです。あなたが表示したいデータのまとまり(例えば50個のエントリ)を得るたびに、あなたは背景MOC​​を持っています。

フォアグラウンドMOCが変更をマージするように設定されていると仮定すると(mergeChangesFromContextDidSaveNotification:経由)、バックグラウンドMOCを保存するたびにフォアグラウンドMOCがこれらの変更をすべて取得します。 NSFetchedResultsControllerを使用していると仮定すると、MOCの変更に対処するためのメソッドを委譲しています.Appleのサンプルコードを使用している場合は、既にすべての設定が正しく行われていると思われます。

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

+0

+1が、私は絶対にすることができます(と持っている) – slf

+3

高速であるかを確認するには、no-保有禁止にしない死の試合でCoreDataに対してhttp://sqlitepp.berlios.de/ピットをしてみたい特定のワークロードにCDを殴ら直接SQLite3を使用します。しかし、通常、関与する努力の量は猥褻でした。私は、CoreDataを使ってより良いアプリケーションを完成させた後、私のアプリケーションの他の部分のチューニングを保存した1/3の時間を費やしてしまいました。 私たちはコードを真空で書いていません。私はいくつかの絶対的な理論的なパフォーマンスをあきらめ、時間を節約して他のアプリコードに実用的なパフォーマンス向上をさせる方が良い場合が多いことを学んできました。明らかに、正確な詳細はプロジェクトごとに異なります。 –

+0

1つのメインMOCにマージされた複数のMOCの使用を示すサンプルコードはありますか? –

2

ジョーヒューイット(Facebookアプリ開発者)は、オープンソースとしてのコードの多くをリリースしています。それはThree20と呼ばれます。そこにインターネットデータを取得し、事前にデータを必要とせずにテーブルに入れるためのクラスがあります。これに使用されるクラスはTTTableViewControllerTTTableViewDataSourceです。

ここからは、CoreDataとして保存するのが大変ではなく、付属のフックに合わせてクラスをサブクラス化するだけです。

あまりにも多くのデータが心配されている場合は、一度に50個は妥当と聞こえます。これらのクラスには、「もっと」ボタンが組み込まれています。 Three20のreadmeから

インターネット対応のテーブルビューコントローラ
TTTableViewControllerと TTTableViewDataSourceヘルプあなたはインターネットから自分のコンテンツ をロード ビルドテーブルへ。むしろちょうど のUITableViewは デフォルトでないようにあなたは、行くに 準備ができて、すべてのデータを持っていると仮定より、TTTableViewControllerはあなたが通信 あなたのデータは ロードされたときにすることができますし、エラーまたは表示する 何がある場合もございます。また、 には、次のデータページの をロードするための[詳細]ボタンを追加することができます。 は、デバイスを振りかけてデータをリロードすることをサポートします。

+0

私ははっきりしないと思います。私は実際にコアデータストアにデータを格納し、テーブルビューを作成します。このサブクラスがセルごとにデータを引き出す場合、この特定の問題を解決することは明らかではありません(これは私が達成する必要のないものです)。 –

0

誰もまだRestKitを言及していませんか?私の友達...真剣に、あなたはこれをチェックしなければなりません。 iOS(そして今はOS X)上でRESTを使って何かをしている場合、特にCore Dataを使って作業したい場合は... RestKitを見てください。私は、サーバーとiOS上のCore Dataモデルとの間にかなり複雑なデータ同期を実装する無数の時間を節約しました。 RestKitはそれをそんなに簡単にしました。ほとんどあなたが病気になります。

+0

RestKitは、XMLと格闘しているようだ - のiOS 5でコンパイルした場合、それは付属していますXMLパーサはARCエラーが全体的にかかわらず、素晴らしい見えた - 特にストレートJSONのために。 – radven

関連する問題