2

関数のたびに、画像をtableViewにロードしています

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

実行すると、画像の別のURLが来ます..

私の問題は、画像の読み込みに時間がかかることです..

私のコードは..

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.tableView1 = tableView;
    static NSString *simpleTableIdentifier = @"SimpleTableCell";
    SimpleTableCell *cell = (SimpleTableCell *)[tableView1 dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

    cell.nameLabel.text = title;

    NSString *imageURL = [NSString stringWithFormat: @"http://www.xyz.com/image1.png];

     cell.thumbnailImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:fullURL]]];
}
return cell;
}

画像のURLが変わるたびに、各画像の読み込みに時間がかかります..

誰でもこの問題を解決するためのアイデアを提案できますか? このコードでマルチスレッドはどのように機能しますか? コードのどこで何を編集すればよいですか?

4

4 に答える 4

3

次のようにバックグラウンドで画像をダウンロードする必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *simpleTableIdentifier = @"SimpleTableCell";
    SimpleTableCell *cell = (SimpleTableCell *)[tableView1 dequeueReusableCellWithIdentifier:simpleTableIdentifier];   
         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
        dispatch_async(queue, ^{

            NSString *u=[NSString stringWithContentsOfFile:r.url encoding:NSUTF8StringEncoding error:nil];
            NSURL *imageURL=[NSURL URLWithString:u];
            NSData *imageData=[NSData dataWithContentsOfURL:imageURL];
            dispatch_sync(dispatch_get_main_queue(), ^{
                SimpleTableCell *cell = (SimpleTableCell *)[tableView cellForRowAtIndexPath:indexPath];
                 cell.thumbnailImageView.image=[UIImage imageWithData:imageData];
                [cell setNeedsLayout];

            });
        });

    }

    return cell;
}

テーブルビューメソッドで上記のコードを使用し、必要な編集を行うだけで、これでうまくいくはずです。

于 2013-03-07T11:54:00.690 に答える
1

マルチスレッドは必要ありません。少なくとも、自分でそれを行う必要はありません。

このチュートリアルを見てください。Apps を使い始めたとき、とても役に立ちました。 http://www.markj.net/iphone-asynchronous-table-image/

または、UIImageView をサブクラス化し、これを実行します: http://codeshape.wordpress.com/2011/05/10/creating-a-lazy-loading-uiimageview-for-ios/

于 2013-03-07T12:06:55.490 に答える
0

以前に使用したジェレミーの答えに代わるものは、HJCacheフレームワークです。

HJManagedImage オブジェクトを使用するだけで、画像を非同期でダウンロードしてキャッシュします

于 2013-03-07T11:55:53.473 に答える
0

SDWebImage フレームワークを見てみましょう。

SDWebImage フレームワーク

多分それはあなたを助けるでしょう。

于 2013-03-07T11:50:58.560 に答える