Вопрос

Мне интересно для тех из вас, кто создает приложения для iPhone на основе REST / SOAP / XML-RPC или просто извлекает динамический XML-канал, что именно для вас означает, когда пользователь говорит "обновить" канал?

Самый простой способ - заполнить некоторую коллекцию, скажем, NSMutableArray , тем, что вы извлекаете из ленты.Если виджет в пользовательском интерфейсе доступен для обновления, я обычно делаю что-то вроде:

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

Похоже, что это наименее эффективный алгоритм обновления XML-канала.Например, многие люди, создающие клиенты Twitter, добавляют изменения к своей существующей ленте, вместо того чтобы снова приводить всю ленту в ее законченном виде.

Какие алгоритмы вы используете для "обновления" ваших моделей при обращении к источнику данных на стороне сервера?

Спасибо всем.

Это было полезно?

Решение

Вам следует рассмотреть возможность использования платформы PubSub, если вам может потребоваться OS X 10.5.Он явно предназначен для извлечения и обновления RSS / Atom-каналов.

(Отказ от ответственности:Я написал много из этого фреймворка, пока работал в Apple :)

Ответ на ваш вопрос заключается в том, что каналы по своей сути неэффективны.Вы можете свести это к минимуму,

  1. Используя HTTP "conditional GETs", так что, если канал не изменился на сервере, вы просто получите крошечный ответ 304.Это экономит время как для сервера, так и для вас.(Некоторые серверы каналов, такие как slashdot, забанят вас, если вы не будете использовать условные gets!)

  2. Проверьте дату "Последнего изменения:" в ответе.Да, даже если вы используете условный GET .Некоторые серверы не обрабатывают их должным образом.Если дата не изменилась, игнорируйте ленту.

  3. Сравните необработанные данные ответа с последним необработанным ответом, который вы получили.Если они идентичны, игнорируйте ленту.(Некоторые серверы не поддерживают условный возврат или отправку дат последнего изменения ...)

  4. Теперь вам нужно проанализировать XML-файл.

  5. Проверьте дату обновления верхнего уровня в самой ленте (это зависит от Atom и разных версий RSS). Опять же, если она такая же, как и в прошлый раз, игнорируйте ленту.

  6. Если вы попали сюда, то, скорее всего, лента была обновлена.Самое простое, что можно сделать, это выбросить все ваши старые сохраненные записи и заменить их новыми.Но это означает, что вы не можете сохранить "исторические" записи, которые выпали из конца ленты.Если вы хотите это сделать, вам нужно просмотреть каждую запись в только что проанализированном фиде, сопоставить ее с соответствующей записью в вашем постоянном хранилище и обновить постоянную запись на основе новой.Если вы не смогли найти постоянную запись, добавьте ее как новую.(Сопоставление записей может быть затруднено в неубедительных RSS-каналах, которые не содержат уникальных идентификаторов GUID для каждой записи.Вы должны попробовать сравнить постоянные ссылки и названия.Фу.)

Все это дело действительно представляет собой большой беспорядок.Потребовалось много работы, чтобы заставить все вести себя корректно и работать со всеми неработающими каналами и серверами;воспользуйся моей болью и используй PubSub, если сможешь :)

Другие советы

Один из подходов заключается в использовании встроенного анализатора извлечения NSXML в фоновом потоке и сравнении записей из потока с тем, что у вас есть в памяти, обновляя только то, что изменилось.

Я только что выпустил программу с открытым исходным кодом Анализатор RSS / Atom для iPhone и, надеюсь, это может принести какую-то пользу.

Я бы тоже хотел услышать ваши мысли по этому поводу!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top