有关多个连接/提要/视图的XML解析的设计/实现建议

Phi*_*ord 7 design-patterns xml-parsing ios

启动我的第一个iOS项目,并想知道如何构建应用程序.该应用程序提取XML提要,解析出来并显示表示XML提要中项目的列表.单击列表中的项目时,应用程序将使用先前提取的XML提要中的一个属性提取新的XML提要.这发生了几层拉,解析,显示和用户选择再次做同样的事情.现在大多数XML元素结构都是这样的:

(这些只是为了演示正在发生的事情的简单示例)

返回(显示新视图的信息):

<items>
    <item id="123" name="item 1" />
    <item id="124" name="item 2" />
    <item id="125" name="item 3" />
</itmes>
Run Code Online (Sandbox Code Playgroud)

收益:

<itemDescription>
    <description itemId="123" name="desc 1" description="blah 1" />
</itemDescription>
Run Code Online (Sandbox Code Playgroud)

想知道:

  • 我应该在每个视图中都有连接类/对象或新连接吗?
  • 我应该在每个视图中都有解析器类/对象或解析XML提要吗?
  • 我还希望存储一些返回的数据,因此如果用户导航回主项列表,我不需要再次调用XML提要,但我每次都需要解析itemsDescription XML提要.

我已经看过几个关于解析XML的教程,我得到了如何做到这一点的要点,希望更多地关注设计和可重用性,而不是在每个新视图中复制代码.或者我离开这是如何工作的

3lv*_*vis 4

遵循Apple指南执行此操作的最佳方法是检查他们的示例之一,几个月前我按照此示例制作了一个与您的应用程序类似的应用程序。您还可以了解如何使您的应用程序处于离线模式。

基本结构(无离线模式):

SeismicXML 示例应用程序演示了如何使用 NSXMLParser 解析 XML 数据。当您启动该应用程序时,它会下载并解析来自美国地质调查局 (USGS) 的 RSS 源,该源提供有关世界各地最近发生的地震的数据。它显示每次地震的位置、日期和震级,以及指示地震严重程度的颜色编码图形。XML 解析使用 NSOperation 在后台线程上进行,并使用批量解析的对象更新地震表视图。

高级结构(带离线模式):

演示如何按照 Core Data 编程指南中提到的第一个推荐模式在多线程环境中使用 Core Data。

它基于 SeismicXML 示例,下载并解析来自美国地质调查局 (USGS) 的 RSS 源,该源提供有关世界各地近期地震的数据。该示例的不同之处在于它使用核心数据持久存储地震。每次启动该应用程序时,它都会下载新的地震数据,在 NSOperation 中对其进行解析,该 NSOperation 检查重复项并将新发现的地震存储为托管对象。

对于那些刚接触 Core Data 的人来说,将 SeismicXML 示例与此示例进行比较并注意在应用程序中引入 Core Data 的必要成分会很有帮助。

关于 cwieland 的答案,我不会使用 ASIHTTPRequest 因为它已经过时了,所以如果你想遵循他的方法,我建议你使用AFNetworking,你可以在其中轻松快速地处理 XML 请求:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://api.flickr.com/services/rest/?method=flickr.groups.browse&api_key=b6300e17ad3c506e706cb0072175d047&cat_id=34427469792%40N01&format=rest"]];
AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
  XMLParser.delegate = self;
  [XMLParser parse];
} failure:nil];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)