0

RSS フィードからデータを読み込んで、タイトルをUITableview. を使用してBlockRSSParser、必要なフィールドをすばやく取得しています-ここ

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

このコードのコメントに注目してください。すぐに実行され、ブログ投稿のタイトルの 1 つが表示されます。

しかし、次の 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 秒後に実行されます。この大幅な遅延の背後にある理由は何ですか? さまざまなサイトのさまざまなフィード URL を使用してみました。それでも同じ出力です。

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 に答える