«Обновление» XML-канала на iPhone / Mac OSX - PullRequest
0 голосов
/ 29 апреля 2009

Мне любопытно, что те из вас, кто создает приложения для iPhone на основе REST / SOAP / XML-RPC или просто извлекают динамический XML-канал, что это значит для вас, когда пользователь говорит «обновить» канал

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 30 апреля 2009

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 15 мая 2010

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

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

0 голосов
/ 29 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...