RSS阅读器:UITableView非常缓慢地显示数据

时间:2013-10-01 10:29:17

标签: ios objective-c uitableview rss

我正在从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秒后执行。这种大延迟背后的原因是什么? 我尝试过使用不同网站的不同网址。仍然是相同的输出。

1 个答案:

答案 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];
    }];
}