2011-08-17 9 views
0

セルを描画するときにサーバーからイメージをロードするのはなぜ避けなければならないのですか?セルを描画中にサーバーからイメージを取得する

私のアプリでは、イメージURLを含むサーバーからデータを取得します。今、私は自分のセルを描画し、これらのイメージのURLを使用してサーバーからイメージを取得し、描画します。さて、画像が実際にそのURLに存在していても、ブラウザで見ることができるので、画像が表示されないことがあります。

この問題を引き起こす可能性のあるセルの描画制限はありますか?サーバーからデータを取得したときにイメージを取得しますか?

イメージが実際に描画される前にセルレンダリングが行われますか。

+0

を解決することを願っていますように セルが描画される前にあなたはURLを取得するとすぐに画像を取得する方が良いでしょう。 –

+0

イメージをスレッドにダウンロードします。 – Abhinav

+0

スレッドが特定のイメージのダウンロードを完了した後で、セルを更新する必要があります。 [reloadRowsAtIndexPaths ...テーブルを使用するには、どの画像URLがどのセルに描かれているかを記述するマッピングが必要です。 – RabinDev

答えて

0

UI表示スレッドであるメインスレッドがある可能性があります。このスレッドからのURLからイメージを取得することで、基本的にセルをブロックしています(つまり、スクロールしています)。また、画像がダウンロードの過程にある場合もあります。この場合、ダウンロードするまで画像が表示されません。

一般に、UITableViewは、表示される準備ができるまでセルを表示しません。メインスレッドでイメージのダウンロードを実行すると、パフォーマンスが低下します。あなたがするべきことは、URL &から画像をダウンロードし、ダウンロードが準備ができたら画像コンテンツのセルを更新するバックグラウンドスレッドを起動することです。

最も良い方法は、メイン画像のダウンロードが完了したときに置き換えられる、デフォルト画像またはスピナーのような初期のプレースホルダを使用することです。

すべてを実装する必要はありません。車輪を再発明することはできません。ここに私が同じものに使用する素晴らしいライブラリがあります - UIImageView + WebCache

0

明らかに、画像のダウンロードにはもっと時間がかかります。ダウンロードが完了するまでプレースホルダイメージを使用する必要があります。ユーザーがスクロールを停止することはできません。

+0

私はそこにスピナーを持っていて、サーバーから返されたイメージがないとプレースホルダイメージを表示します。私はこれが間違っているかどうかを知りたい。 – Abhinav

+0

これは完璧です。もう1つの方法は、プレースホルダーのイメージを最初から保持することです(スピナーを使用せずに)。ダウンロードが完了したら、プレースホルダーをダウンロードしたイメージに置き換えます。おそらくUIノイズが少なくなります。 – Akshay

0

私はサーバーからのデータを取得し、その情報をビューに渡します。

ImageView *imageView = [[ImageView alloc] initWithNibName:@"ImageView" bundle:[NSBundle mainBundle]]; 
imageView.prod=self.prod; 
imageView.hidesBottomBarWhenPushed = YES; 
[self.navigationController pushViewController:imageView animated:YES]; 
[imageView release]; 
imageView=nil; 

希望これはあなたの問題を解決します

1
NSString *imgUrl = [ImageURLArray objectAtIndex:indexPath.row]; 

if(imgUrl != nil) 
{ 
    NSString * ImagePath; 

    NetworkManager *manager = [[NetworkManager alloc] init]; 

    ImagePath = [manager GetFile:imgUrl]; 

    [manager release]; 

    manager = nil; 

    if(ImagePath != nil) 

    { 

      UIImage *newImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:ImagePath]];   

     UIGraphicsBeginImageContext(CGSizeMake(50, 50)); 

     // now redraw our image in a smaller rectangle. 
     [newImage drawInRect:CGRectMake(25, 10, 30, 30)]; 

     newImage = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

     cell.imageView.image = newImage; 
    } 
} 
    return cell; 

}

これはイメージが常にダウンロードが完了していないようですねあなたの問題

関連する問題