0

tableViewCell に非同期で画像を読み込もうとしています。テーブルを上下に移動すると、画像が表示されます。

AsyncImageView には NSUrlConnection が含まれています。デリゲート「connectionDidFinishLoading」の中には入りません。しかし、テーブルを上下に移動すると、このデリゲート関数内に入ります

以下はコードです

        CGRect frame;
        frame.size.width=115; frame.size.height=100;
        frame.origin.x=0; frame.origin.y=0;
        AsyncImageView* asyncImage = [[[AsyncImageView alloc]
                                       initWithFrame:frame] autorelease];
        loadingTable=[[UIActivityIndicatorView alloc] initWithFrame:frame];
        [cell.contentView addSubview:loadingTable];
        [loadingTable startAnimating];
        asyncImage.tag = 999;
        NSURL* url = [NSURL URLWithString:[[videoCollection objectAtIndex:indexPath.row] videoImageUrl] ];
        [asyncImage loadImageFromURL:url activity:loadingTable];
        [cell.contentView addSubview:asyncImage];
4

3 に答える 3

1

最初にすべての画像をロードし、配列などのデータ構造を追加してから、それをテーブルに表示します。UI をネットワーク呼び出しと重複させないでください。

于 2012-05-15T09:12:05.400 に答える
0

ご存知のように、すべての UI 関連のビジネスはメイン スレッドで実行する必要があります。ただし、大量のデータのダウンロードはバックグラウンドで実行できますし、実行する必要があります。そして、Grand Central Dispatch を使用したこのチュートリアルは、まさに必要なものかもしれません。

バックグラウンド スレッドで画像をダウンロードし、完了したらメイン スレッドにこれを知らせ、メイン スレッドで UI の更新を行います。

于 2012-05-16T08:35:28.930 に答える
0

私は昨日これをやった。

最良の方法は、ダウンロードをバックグラウンドおよびメソッドで呼び出すこと- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPathです。

このメソッドは、ユーザーが見たいときにセルの画像をロードします。

しかし警告!同じ画像を何度もダウンロードしないようにするには、データ構造 (辞書など) を使用して、画像がダウンロードされたかどうかを確認する必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    if([myPictures objectForKey:indexPath.row] == nil) {
        [self performSelectorInBackground:@selector(downloadPhotoInBackground:) withObject:indexPath];
    }
    return cell
}

downloadPhotoInBackground: では、ダウンロードした画像を「myPictures」プロパティに追加することを忘れないでください。

于 2012-05-16T08:47:03.413 に答える