注:ARCを使用しています
Web URL から画像を読み込むときに見事に機能する遅延画像読み込み手法があります。ただし、コア データからの画像の読み込みに問題があります。これが私が使用している方法です:
最初に変更可能な配列を初期化して割り当て、コア データからデータをロードしてから、配列に格納します。それから私はこのコードを持っています:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(loadImage)
object:nil];
[queue addOperation:operation];
その後...
- (void)loadImage {
for (int i = 0; i < [myArrayFromCoreData count]; i++) {
AnObject *myObject = [myArrayFromCoreData objectAtIndex:i];
UIImage* image;
if ([myObject.image length] == 0) {
image = [UIImage imageNamed:@"default.png"];
}
else {
image = [[UIImage alloc] initWithData:myObject.image];
}
[self performSelectorOnMainThread:@selector(displayImage:) withObject:[NSArray arrayWithObjects:image,myObject.myObjectId, nil] waitUntilDone:NO];
}
}
- (void)displayImage:(NSArray*)array {
[loadedImages setObject:[array objectAtIndex:0] forKey:[array objectAtIndex:1]];
[self.myTable reloadData];
}
ここまで遅延はなく、NSLog はすべての画像が myObjectLoadedImages 配列に追加されたことを示しています。
私が抱えている問題は、テーブル ビューをスクロールするときにラグがあり、クラッシュすることがあるということです。ロードされた画像を表示するために使用しているコードは次のとおりです。
UIImage* image = [loadedImages objectForKey:myObject.myObjectId];
if (image != NULL) {
myImageView.image = image;
}
else {
myImageView.image = [UIImage imageNamed:@"default.png"];
}
これはcellForRowAtIndexPath
メソッド内にあるため、セルが表示されるたびに呼び出されます。私のコードは、Web URLから画像を正常にロードしているクラスから適応されているため、ここで間違っていることはありますか?