【问题标题】:Loading and parsing xml document freezes my GUI in Iphone加载和解析 xml 文档会冻结我在 Iphone 中的 GUI
【发布时间】:2009-07-16 09:41:32
【问题描述】:

我正在构建一个应用程序,它将读取 rss 提要并将它们呈现在 UITableViews 中。我在谷歌上搜索,在这里,我决定使用 LibXML。

当我的应用程序启动时,它会检查它是否具有有效的互联网连接,并抓取一个 rss 提要,我从中提取一些数据并使用 tableViews 创建一个 uiTabBar。在解析第一个 rss 提要并构建 UITabBar 之后,对于我的 uiTabBar 中的每个按钮,我都有不同的 rss 提要(类别)。当我有良好的互联网连接 (wifi) 甚至 3G 时,我的应用程序运行得非常好,但是当互联网连接受到影响时,我的应用程序也会这样做。

因为我一个接一个地解析所有提要,并且在主线程中 GUI 停止响应,这是一个问题。

我使用 LibXML 来解析我的提要,我这样做:

CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];

NSArray *resultDate = NULL;
resultDate = [rssParser nodesForXPath:@"//channel" error:nil];

for(CXMLElement *date in resultDate)
{
    NSString *data = (NSString *)[[date childAtIndex:12] stringValue];
    [self setLastBuildDate:[[self parseDate:data] copy]];
    break;
}

NSArray *resultNodes = NULL;
resultNodes = [rssParser nodesForXPath:@"//item" error:nil];

for(CXMLElement *resultElement in resultNodes)
{
    NSMutableDictionary *feed = [[NSMutableDictionary alloc] init];
    int counter;

    for(counter = 0; counter < [resultElement childCount]; counter++)
    {
        [feed setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
    }
    [links addObject:[feed objectForKey:@"link"]];
    [feedsList addObject:[feed copy]]; 
    [feed release];
}
[newsTable reloadData];

当我按下 uitabbar 上的按钮时,我尝试仅解析第一个按钮和其他按钮的提要,但我无法调用在 -didselectitem 事件上抓取和解析提要的函数。

现在我正在考虑在另一个线程中解析它们而不是在主线程中..有人可以给我一些指示吗?

提前谢谢你

【问题讨论】:

    标签: iphone xml parsing asynchronous


    【解决方案1】:

    基本问题是initWithContentsOfURL: 会阻塞,直到它从 Web 获取数据,这可能需要几秒钟。如果您在应用程序的主线程上调用它,它基本上会在网络流量期间锁定整个应用程序。

    另一种选择是使用NSURLConnection 来下拉数据。它不如initWithContentsOfURL:的单一方法调用方便,但本质上是异步的。因此,您不必自己实现线程和回调,只需实现几个委托方法,然后创建NSURLConnection 的实例。

    有关详细信息,请参阅URL loading system 的官方文档。

    【讨论】:

      【解决方案2】:

      查看 NSOperation 和 NSOperationQueue。它们对于多线程非常有用。

      基本上继承 NSOperation 并将您的代码写入 main 方法。然后将您的操作添加到操作队列中,每个操作将在另一个线程上运行。

      您可以在操作完成时设置回调,以便将解析后的数据反馈给您的视图。

      【讨论】:

        【解决方案3】:

        我发布了一个开源RSS/Atom Parser for iPhone,它使阅读和解析网络提要变得非常容易。

        您可以将其设置为异步下载数据,也可以在后台线程中同步运行以收集 Feed 数据。这样,在解析数据时,您的 UI 将是免费的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-19
          • 2022-01-05
          相关资源
          最近更新 更多