如何在不阻止UI的情况下将内容加载到TableView中?

时间:2011-09-13 20:00:47

标签: iphone objective-c ios uitableview nsoperation

我正在使用TableView,该控制器从Web Feed下载数据,解析并填充此TableView中的内容。 Feed只提供10个项目的数据块。因此,例如,当有112个项目可能需要大约12个服务器请求时加载数据。我想在没有阻止用户屏幕的情况下发出这些请求,它应该按顺序加载数据,就像它不能加载第5页上的项目,除非它已经获取了前一个(1,2,3,4按照这个确切的顺序)例子)。

关于如何实现这个的任何想法?

请事先提供帮助,

的Stephane

2 个答案:

答案 0 :(得分:5)

使您的网络电话异步。不要在主UI线程上进行Web调用......

例如,如果您使用ASIHttp library进行http调用(这是建立在Apple的NSURLConnection之上),那么制作异步请求就像 -

一样简单
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];

当获取数据时,将调用这些选择器回调 -

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

这肯定会让你的UI响应......

另请注意,仅在主线程上更新UI元素。从后台线程开始更新ui元素很容易。所以请记住......

答案 1 :(得分:1)

您不需要使用其他API,也可以使用Apple自己的NSURLConnection。它可以同步或异步检索数据。当然后者在你的情况下是必要的。您将数据保存在请求的委托方法中。

– connection:didReceiveResponse:
– connection:didReceiveData:
– connection:didFailWithError:
– connectionDidFinishLoading:

另外,请参阅我最近对this question的更完整答案。