画像の非同期ロード

前回の内容とも関わるのですが、UITableViewCellの画像をWEBからロードする場合も、スクロールが非常に重くなることがあります。
前回同様、配列を使って回避できるかなと思ったのですが、うまく表示させることができませんでした。(もし方法があればご教示頂けると幸いです!)
そこで、画像は非同期通信でロードし、ロードできたものから順次表示されるようにしました。

環境
  • iPhoneSDK 3.1.3


方法はこちらのページを参考にさせて頂きました。
非同期通信で画像をロードする方法について - プログラミングノート
大まかな流れとしては、UIImageViewを継承したクラスを作成し、そのクラスに画像データのロードを行わせ、cell.imageViewにaddSubviewする形となります。


ただ、私の環境で試したところ、addSubviewだけでは表示されなかった(cell.imageView.imageが確保されていない感じ)ため、下記のようにデフォルト画像を明示的に指定しました。

// tableView:cellForRowAtIndexPath

UIAsyncImageView *ai = [[UIAsyncImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[ai loadImage:@"URL"];
[cell.imageView addSubview:ai];
cell.imageView.image = [UIImage imageNamed:@"NoPhoto.png"];   // デフォルト画像を明示的に指定


また、これだけですと、スクロールしてセルが再利用されたとき、新しい画像がロードされるまで古い画像が残っていて違和感がありました。
そこで、UIAsyncImageView.mにinitWithFrameを定義し、セル再利用時もデフォルト画像にリセットされるようにしました。

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
	
    if (self) {
	self.image = [UIImage imageNamed:@"NoPhoto.png"];   // セル再利用時にもこのメソッドが呼ばれるため、画像をリセット
    }
	
    return self;
}