我正在从rss Feed加载数据并在UITableview
中显示标题。
我正在使用BlockRSSParser
来快速获取必填字段 - Here
我正在使用NSLog
来跟踪收到数据的时间。收到数据后,UITableView
显示数据大约需要20秒。
这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
[self setTitle:@"Loading..."];
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://blog.stackoverflow.com/feed/"]];
[RSSParser parseRSSFeedForRequest:req success:^(NSArray *feedItems) {
[self setTitle:@"Blogs"];
[self setDataSource:feedItems];
[self.tableView reloadData];
RSSItem *item = [dataSource objectAtIndex:2];
NSLog(@"loaded cell %@", [item title]);
} failure:^(NSError *error) {
[MBProgressHUD hideHUDForView:self.view animated:YES];
}];
}
请注意此代码中的注释。它会很快执行,并向我展示博客文章的标题之一。
然后在接下来的20秒内,在下面的方法最终开始之前没有显示任何内容:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[MBProgressHUD hideHUDForView:self.view animated:YES];
RSSItem *item = [dataSource objectAtIndex:indexPath.row];
NSLog(@"loaded cell %@", [item title]);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:item.title];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:item.title];
}
// Configure the cell...
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
NSString *theTitle = [item title];
cell.textLabel.text = theTitle;
return cell;
}
此代码中的注释在20秒后执行。这种大延迟背后的原因是什么? 我尝试过使用不同网站的不同网址。仍然是相同的输出。
答案 0 :(得分:1)
您需要在主队列上执行所有与UI相关的任务。下面的示例代码可能需要进行一些调整才能将变量放入块中。
- (void)viewDidLoad
{
[super viewDidLoad];
[self setTitle:@"Loading..."];
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://blog.stackoverflow.com/feed/"]];
[RSSParser parseRSSFeedForRequest:req success:^(NSArray *feedItems) {
dispatch_async(dispatch_get_main_queue(), ^{
[self setTitle:@"Blogs"];
[self setDataSource:feedItems];
[self.tableView reloadData];
});
RSSItem *item = [dataSource objectAtIndex:2];
NSLog(@"loaded cell %@", [item title]);
} failure:^(NSError *error) {
[MBProgressHUD hideHUDForView:self.view animated:YES];
}];
}