如何在更新UITableView时在后台线程中执行网络任务?

时间:2011-02-10 00:01:52

标签: iphone multithreading nsurlconnection

试图找出设计此类功能的最佳方法是什么?基本上我发送一个异步NSURLConnection,它会命中一个发回一堆数据的服务器。一旦我得到数据,我必须对它执行一些相当昂贵的工作,我宁愿在bg线程中做以防止UI锁定。最后,当接收和处理来自服务器的响应时,我还需要动态地进行适当的更新。

我的问题是我将如何在后台线程中执行该工作 as 数据到达,以便表格不会等到所有数据加载后再更新?

这是我到目前为止的伪代码。在我的ViewController中,我将有两个BOOL标志newDataReceived和dataFinishedDownloading。我还有两个变量,一个包含当前数据的字符串和一个保存处理数据结果的nsarray。然后,

  1. 在didReceiveResponse中:我将通过调用performSelectorInBackground来生成一个新线程:处理方法作为选择器。
  2. 在那个方法中,我会有一个循环,首先检查newDataReceived以查看新数据是否已经到达,如果是,那么就可以对它进行一些处理。
  3. 一旦完成处理,我将设置带有结果的nsarray,然后调用另一个更新表数据源的方法,并使用performSelectorOnMainThread重新加载表:
  4. 最后,我会检查dataFinishedLoading标志,看看是否还有其他数据需要处理
  5. 如果还有数据并且会重新开始,否则清理线程并退出
  6. 还将在didReceiveData中设置newDataReceived标志:以及接收的实际数据。最后在didFinishLoading中,我将设置dataFinishedLoading标志以表示已加载所有数据。

    我计划在#2-4中使用NSLock,检查状态标志以及获取和设置接收到的数据字符串和结果nsarray。

    我确定有很多方法可以做同样的事情,但这看起来是一个好方法吗?

    THX

2 个答案:

答案 0 :(得分:1)

你可以看看NSOperation和NSOperationQueue。 NSOperation是在后台进行繁重计算和操作的完美替代方案。如果你需要不断更新tableview,你可以在你的Operation中实现一些协议来处理tableview的回调。

答案 1 :(得分:0)

使用performSelectorOn ...方法可以实现您想要做的事情。看看这个:http://arstechnica.com/civis/viewtopic.php?f=20&t=49035

请记住,UI更新应该在主线程中完成(因此使用performSelectorOnMainThread进行UI更新)。