質問

REST / SOAP / XML-RPCに基づいてiPhoneアプリを構築している人、または単に動的なXMLフィードをプルダウンしている人に興味があります。

簡単な方法は、NSMutableArrayなどのコレクションに、フィードから取得したものを取り込むことです。 UIのウィジェットを更新できる場合、通常は次のようにします:

[myMutableArray removeAllObjects];
// follow steps to repopulate myMutableArray

これは、XMLフィードを更新するための最も効率の悪いアルゴリズムのようです。例えば、Twitterクライアントを構築している多くの人々は、既存のフィードに変更を追加しているのに対して、フィード全体を完全な形で再びダウンさせています。

「更新」に使用するアルゴリズムの種類サーバー側のデータソースと話すときにあなたのモデル?

ありがとうございます。

役に立ちましたか?

解決

OS X 10.5が必要な場合は、PubSubフレームワークの使用を検討する必要があります。 RSS / Atomフィードを取得して更新するように明示的に設計されています。

(免責事項:Appleにいる間にそのフレームワークの多くを書いた:)

質問に対する答えは、フィードは本質的に非効率的であるということです。これを最小化するには

  1. HTTP" conditional GETs"を使用しているため、サーバーでフィードが変更されていない場合は、小さな304応答が返されます。これにより、サーバーとユーザーの時間を節約できます。 (slashdotのような一部のフィードサーバーは、条件付き取得を使用しないと禁止されます!)

  2. 「最終変更:」を確認します。応答の日付。はい、条件付きGETを使用する場合でも。一部のサーバーはそれらを適切に処理しません。日付が変更されていない場合、フィードを無視します。

  3. 応答の生データを、最後に取得した生の応答と比較します。同一の場合、フィードを無視します。 (一部のサーバーは条件付き取得をサポートしていないか、最終更新日を送信しません...)

  4. ここで、XMLを解析する必要があります。

  5. フィード自体の最上位のmod日付を確認します(これは、AtomとRSSのフレーバーによって異なります。)前回と同じ場合は、フィードを無視します。

  6. ここに来たら、おそらくフィードが更新されています。最も簡単な方法は、保存した古いエントリをすべて破棄し、新しいエントリで置き換えることです。しかし、これは、フィードの終わりから落ちた「履歴」エントリを保持できないことを意味します。これを行うには、解析したばかりのフィードの各エントリを調べ、永続ストレージの対応するエントリと一致させ、新しいエントリに基づいて永続エントリを更新する必要があります。永続的なものが見つからない場合は、新しいエントリとして追加します。 (エントリごとに一意のGUIDが含まれていない不完全なRSSフィードでは、エントリのマッチングが難しい場合があります。パーマリンクとタイトルを比較してみてください。ヤック。)

これは本当に大きな混乱です。すべてが正しく動作し、壊れたフィードやサーバーをすべて動作させるには多くの作業が必要でした。可能であれば、私の痛みを利用してPubSubを使用してください:)

他のヒント

1つのアプローチは、バックグラウンドスレッドで組み込みのNSXMLプルパーサーを使用し、ストリームのエントリをメモリ内のエントリと比較し、変更されたもののみを更新することです。

オープンソース RSS / Atom Parser for iPhone をリリースしました。使用します。

あなたの考えも聞きたいです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top