在线访问XML数据?

时间:2010-03-24 16:59:20

标签: iphone objective-c

我正在测试一个应用程序,以便从我以前使用过的Web服务器上获取数据:

NSURL, NSURLRequest, NSURLConnection等获取我想要的数据。

但我刚刚注意到,如果我交换使用XML,我可以简单地执行以下操作并将结果传递给NSXMLParser:

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

我是否正确地认为如果你刚刚接受XML这是一个可接受的方法?与我以前的做法相比,它看起来似乎很短暂?

加里

3 个答案:

答案 0 :(得分:1)

该代码仅创建表示URL的URL对象。它不会发出任何请求或下载任何数据。您仍然需要使用NSURLRequestNSURLConnection才能从服务器实际下载任何数据。

另外,远离'initWithContentsOfURL:`和朋友之类的方法,除非你明白他们会阻止他们被调用的线程直到完成。对于网络服务,不应使用此方法,因为它会在不确定的时间内阻止您的UI,因为您无法预测在使用该应用的任何地方互联网连接的速度。

NSURLConnection的异步请求系统正是您所需要的。它不会阻止UI,并提供了一个很好的封装接口,可以从远程位置下载数据。

答案 1 :(得分:1)

这绝对是正确的方法。确实存在许多不同的连接方法(包括我最喜欢的,ASIHTTPRequest)和许多不同的xml解析器(包括我最喜欢的,KissXML),它们比Apple内置的方法更快或更高效。

但回答你的问题,是的,你的逻辑和设计模式是正确的。

更新:因为Jasarien似乎认为问题涉及异步行为,我将在此讨论。 ASIHTTPRequest非常容易处理异步。只需查看快速samples即可。

答案 2 :(得分:0)

根据您从Web服务返回的XML数量,NSXMLParser可能并不理想,因为必须将整个XML文档读入内存。

iPhone上的内存非常稀缺,因此使用libxml2中的SAX解析器可能更适合较大的XML文件。 XML不是将整个文档读入内存,而是流式传输并解析特定的感兴趣节点。内存开销较低,因为一次存储的数据较少。

一旦解析了一个感兴趣的节点,就会调用一个事件处理程序来做一些有用的事情,比如在某个地方存储节点数据。

在这种情况下,请查看Apple的XMLPerformance示例项目以获取示例代码。