0

我正在从 rss 提要加载数据并在UITableview. 我正在使用BlockRSSParser, 来快速获取必填字段 -这里

NSLog用来跟踪何时收到数据。收到数据后,大约需要 20 秒才能UITableView显示数据。

这是我的代码:

- (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 秒后执行。如此大的延迟背后的原因是什么?我尝试过使用来自不同站点的不同提要网址。还是一样的输出。

4

1 回答 1

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];
    }];
}
于 2013-10-01T12:10:33.363 回答