2011-02-10 75 views
2

只是想弄清楚什么是设计这种功能的最佳方式?基本上我发送一个异步的NSURLConnection,它会发送一个返回一堆数据的服务器。一旦我得到的数据,我必须执行一些工作,它是非常昂贵的,而我宁愿做一个bg线程,以防止UI锁定。最后,我还需要随着从服务器收到并处理的响应动态地进行可用的更新。如何在更新UITableView时在后台线程中执行网络任务?

我的问题是我将如何去做后台线程中的工作作为数据到达,以便该表不会等待,直到所有的数据已被加载之前被更新??

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

  1. in didReceiveResponse:我会通过调用performSelectorInBackground:用处理方法作为选择器来产生一个新的线程。
  2. 在这种方法中,我会有一个循环,首先会检查newDataReceived以查看是否有新数据到达,如果有,请对其执行一些操作。
  3. 一旦处理完毕,我会接盘的结果的NSArray中,然后调用更新表格数据源,并重新加载使用performSelectorOnMainThread表的另一种方法:
  4. 最后我想检查dataFinishedLoading标志,以查看是否有任何数据处理
  5. 如果还有数据,并会从头再来,否则清理线程退出

另外,newDataReceived标志将在didReceiveData设置:以及接收到的实际数据。最后在didFinishLoading中,我会设置dataFinishedLoading标志来表示所有数据都已加载。

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

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

THX

+0

任何人以相同或差异的方式做了类似的事情? – James 2011-02-10 21:40:28

回答

0

你要找做可以与performSelectorOn ...方法来实现。看看这个:http://arstechnica.com/civis/viewtopic.php?f=20&t=49035

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

+0

嗨,thx的输入,但我希望多一点。我熟悉上述的performSelectorOn方法,虽然不完全确定你的意思。 – James 2011-02-10 21:40:08

1

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