时间:2011-02-20 09:24:01

标签: iphone xcode uitableview rss

这就是我想要做的事情: 从apple的RSS中获取xml,其中包含有关应用程序的信息,解析它,并在UITable视图中显示应用程序。

问题是在“reloadData()”之后,显示信息大约需要5秒钟。 此外,应用程序在打开项目后第一次运行时总会崩溃。

这是项目: http://www.mediafire.com/?2dn6g916bh9uf4v

2 个答案:

答案 0 :(得分:20)

在表格中显示缓慢加载(即基于网络)数据的公认惯用法是,如果表格中尚未存在数据,则在单元格中显示活动指示符,然后在后台下载数据( NSOperationQueue和NSOperation非常适用于此,并在数据准备就绪时发出通知。几乎可以肯定,在向表提供数据时,您自己的延迟(网络延迟和解析时间),而不是UITabvleView在处理reloadData调用时的延迟。

编辑:更多信息,并解决延迟问题:

  • 代码从主线程外部调用UI例程(“[table reloadData]”)。那很糟糕,不要这样做。

  • 您正在尝试将图像信息“推送”到[self loadImages]中的表格中,而不是让表格在cellForRowAtIndexPath中一次“拉”一行信息。

编辑:好的,将我的钱放在我的嘴边:我做了以下更改,所有延迟都消失了(根据NSLog时间戳,它在performSelectorOnMainThread和cellForRowAtIndexPath之间大约2毫秒)。

//[table reloadData];
NSLog( @"thread: calling reload" );
[table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
//[self loadImages];

注意,应用程序仍然不正确,图像尚未刷新。请记住:在后台下载图像,并向视图控制器类发送新图像可用的通知,然后调用[重新加载表](当然是从主线程中运行的通知处理程序!)。不要从任何后台线程调用UIKit函数。这应该足以让您重构代码以做正确的事情。

答案 1 :(得分:1)

我也遇到了同样的问题。我通过在UI线程上运行我的代码解决了这个问题:

  NSOperationQueue.mainQueue().addOperationWithBlock(){
  //Perform action on main thread
    tableView.reloadData();
  }