2

xmlデータを解析した後、(配列infoservicesで)入力するカスタムセルを持つUITableViewがあります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            [self.cellNib instantiateWithOwner:self options:nil];
            cell = tmpCell;
            self.tmpCell = nil;          
        }       

        infoService *e = [self.infoservices objectAtIndex:indexPath.row];

        cell.name = [e  infoName];

        NSString *infodetails = [e infoDetails];

        if ( infodetails == nil ) {
            cell.details = @"Loading...";
            [self startInfoDownload:e forIndexPath:indexPath];

            NSLog(@"Loading...");
        } else  {
            cell.details = infodetails;
            NSLog(@"Show info detail: %@", infodetails );
        }
        return cell;
}


- (void)infoDidFinishLoading:(NSIndexPath *)indexPath
{
    infoDownloader *infoserv = [imageDownloadsInProgress objectForKey:indexPath];
    if (infoserv != nil)
    {

        [infoservices replaceObjectAtIndex:[indexPath row] withObject:infoserv.appRecord];

        NSIndexPath *a = [NSIndexPath indexPathForRow:indexPath.row inSection:0]; // I wanted to update this cell specifically
        ApplicationCell *cell = (ApplicationCell *)[self.tableView cellForRowAtIndexPath:a];
        cell.details = [[infoservices objectAtIndex:[indexPath row]] infoDetails];

        NSLog(@"Updating=%@", [[infoservices objectAtIndex:[indexPath row]] infoDetails]);
    }
}

セルごとに、NSURLConnection sendAsynchronousRequest を使用して、オブジェクト infoDownloader から xml データを取得して解析しています

- (void)startDownload

個々のセルごとに。

データが正常に解析された後、infoDownloader からデリゲート メソッドが呼び出されます

- (void)infoDidFinishLoading:(NSIndexPath *)indexPath

問題は、

- (void)infoDidFinishLoading:(NSIndexPath *)indexPath 

各セルを解析した後に呼び出され、

NSLog(@"Updating=%@", [[infoservices objectAtIndex:[indexPath row]] infoDetails]);

詳細が正しいデバッガーでは、セルはすぐには更新されず、6 秒または 7 秒後に更新されます。また、cellForRowAtIndexPath は呼び出されません。

- (void)infoDidFinishLoading:(NSIndexPath *)indexPath 

なんらかの理由で、infoDidFinishLoading の後にデバッグ出力がないためです。また、 cellForRowAtIndexPath が再度呼び出されないため、 cell.details が実際にどのように更新されるのかわかりません。

Apple の LazyTableImages 読み込みの例を使用してこの関数をセットアップしようとしましたが、これは成功しましたが、何が問題なのかわかりません。

4

2 に答える 2

0

reloadRowsAtIndexPathsデータがロードされたら、呼び出す必要がある場合があります。セル データは読み込まれているが、セルの描画が更新されていない可能性があります。

[e infoDetails]また、リクエストが行われる場合は同じデータを複数回リクエストできると思いますがnil、データがロードされる前にセルが複数回リクエストされる可能性があるため[self startInfoDownload:e forIndexPath:indexPath]、同じデータをダウンロードして複数回呼び出される可能性があります。データを要求した行を追跡することを検討する必要があります。

これを解決する方法については、このコードを参照してください: https://github.com/kgn/Spectttator/blob/master/SpectttatorTest-iOS/RootViewController.m#L123

于 2012-04-10T07:27:02.823 に答える
0

UI に影響するすべての変更は、メイン スレッドで実行する必要があります。

tableView の更新、セルの詳細の変更、タブ ビューの再読み込み、行の再読み込みなどは、UI に影響する変更です。

特に、以下を使用してメイン スレッドで変更を実行する必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
    cell.details = [[infoservices objectAtIndex:[indexPath row]] infoDetails];
}

または iOS 4 より前:

cell performSelectorOnMainThread:@selector(setDetails:) withObject:[[infoservices objectAtIndex:[indexPath row]] infoDetails];
于 2013-03-21T09:40:56.083 に答える