0

UITableview セルのデータ ソースは次の場所にあります。

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }
}

しかし、セルを描画する前に接続が開始されても、接続が完了する前にセルを描画するメソッドが呼び出されます。セルの描画方法を遅らせたり、セルを描画する前に接続が完了していることを確認するにはどうすればよいですか?

4

3 に答える 3

0

データのロードが完了した後でのみ、テーブルビューのデータソースとデリゲートのプロパティを設定する必要があります。IB や Storyboard から tableview のデリゲートとデータソースを設定している場合は、削除します。データの読み込みが完了したら、tableview のデリゲートとデータソースのプロパティを設定します。テーブルもリロードします。

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }

    [tableView setDelegate:self];// set delegate, datasource & reload data.
    [tableView setDatasource:self];
    [tableView reloadData];
}
于 2012-12-08T08:41:24.253 に答える
0

セル情報を提供するメソッドは、表示できる行があることを伝えた場合にのみ呼び出されます。で正しいことを伝えると (tableView:numberOfRowsInSection:接続が完了していない場合は 0 になる可能性があります)、 への誤った呼び出しはありませんtableView:cellForRowAtIndexPath:

于 2012-12-08T12:49:06.380 に答える
0

それがASYNCHRONOUSネットワーキングのポイントです:)メインスレッドは終了するのを待ちません! 同期はありますが、悪いです

データがまだ利用できない場合は、UI で処理してください。

a)tableviewを非表示に設定し、糸車を表示し、connectionDidFinishが呼び出されたときにテーブルを表示して再読み込みします

モックコード

-viewWillAppear {  
    table.hidden = YES;  
    spinningActivity.hidden = NO;  
    networkConnection start];
 }

-connectionDidFinish {
    spinningActivity.hidden = YES;
    [table reloadData];
    table.hidden = NO; 
}
于 2012-12-08T10:21:50.340 に答える