2010-03-24 3 views
0

Я просто тестирую приложение, чтобы получить данные с нашего веб-сервера, ранее я использовал:Доступ к данным XML онлайн?

NSURL, NSURLRequest, NSURLConnection и т. Д., Чтобы получить данные, которые я хотел.

Но я только заметил, что если бы я поменяться с помощью XML я могу просто сделать следующее и передать результаты в NSXMLParser:

NSURL *url = [NSURL URLWithString:@"https://www.fuzzygoat.com/turbine?nbytes=1&fmt=xml"]; 

я прав, полагая, что если ваш только после того, как XML это приемлемый метод? Это просто кажется очень коротким по сравнению с тем, что я делал раньше?

Гэри

ответ

1

Этот код только создает объект URL, который представляет URL. Он не делает никакого запроса или не загружает какие-либо данные. Вам все равно необходимо использовать NSURLRequest и NSURLConnection, чтобы фактически загрузить любые данные с сервера.

Кроме того, избегайте таких методов, как «initWithContentsOfURL:» и друзей, если вы не понимаете, что они заблокируют поток, на который они вызываются, до завершения. Для сетевых служб этот метод не должен использоваться, поскольку он заблокирует ваш пользовательский интерфейс в течение неопределенного времени, потому что вы не можете предсказать, насколько быстро интернет-соединение будет использоваться везде, где используется приложение.

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

+0

Это хороший вопрос о потоковом и блокировании основной темы. Я буду помнить об этом. Что касается URLWithString: не работает, конечно, но остальная часть соединения должна быть решена NSURLParser, поскольку он правильно анализирует URL-адрес, не используя NSURLRequest & NSURLConnection. – fuzzygoat

+0

Я предполагаю, что вы имеете в виду 'NSXMLParser', а не' NSURLParser'?Если это так, то это правда, он загрузит содержимое URL-адреса и проанализирует его, но это не очень хороший способ сделать это. Это связано с тем, что вызов 'initWithContentsOfURL:' на NSXMLParser является синхронным вызовом и будет блокироваться в течение минуты, если XMLParser не сможет связаться с URL по какой-либо причине. – Jasarien

+1

Извините, моя ошибка NSXMLParser. Кажется, я знаю, что делать сейчас. Используйте NSURLRequest, а затем NSURLConnection, чтобы получить ответ NSData, затем я могу передать это в NSXMLParser, используя initWithData: это похоже на это? – fuzzygoat

0

В зависимости от того, сколько XML вы вернетесь из веб-службы, NSXMLParser может быть не идеальным, потому что весь XML-документ должен быть прочитан в память.

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

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

В этом случае посмотрите пример примерного проекта Apple XMLPerformance.

+0

Объем данных на самом деле довольно маленький, его около 3-4 тыс. Данных. – fuzzygoat

+0

Его очень небольшой объем данных и использование NSXMLParser, вероятно, немного переборщил, но я просто хотел сделать это правильно для будущей ссылки. До использования XML я был просто «скриншотом экрана», поэтому это, безусловно, более элегантно. – fuzzygoat

1

Это, безусловно, правильный путь. Существует множество различных способов подключения (включая мой любимый, ASIHTTPRequest) и множество различных XML-парсеров (включая мой любимый, KissXML), которые быстрее или эффективнее памяти, чем встроенные в Apple методы.

Но чтобы ответить на ваш вопрос, да, ваша логика и шаблон дизайна верны.

ОБНОВЛЕНИЕ: Поскольку, кажется, Jasarien считает, что вопрос говорит об асинхронных действиях, я буду обсуждать это здесь. ASIHTTPRequest обрабатывает async очень легко. Просто проверьте быстро samples.

+0

Я полностью не согласен. Если вы не настроите собственное управление потоками, этот метод будет блокироваться до завершения, что неприемлемо при доступе к сетевым ресурсам. Если URL-адрес возвращает большой XML-документ, а пользователь, запускающий приложение, подключен к EDGE или даже GPRS-соединению, этот метод может блокироваться в течение нескольких секунд, что создаст впечатление, что приложение вяло и не реагирует. Использование асинхронных API, когда это возможно при работе с сетевыми ресурсами, например «ASIHTTPRequest», которые вы упоминаете, «определенно, правильный путь», как вы выразились. – Jasarien

+0

Я забыл упомянуть, что при использовании этих синхронных методов тайм-аут по умолчанию составляет 1 минуту, что означает, что если по какой-либо причине сетевой ресурс недоступен, приложение замерзает в течение 1 минуты до возобновления, и пользователь определенно не будет счастлив об этом. – Jasarien

+0

Я думаю, вы должны вернуть ваш downvote. Вопрос был не в асинхронном или синхронном, а в том, как получить и проанализировать xml. Несомненно, асинк - это правильный путь, но это другой вопрос. – coneybeare