我有一个需要滚动许多图像的应用程序。
因为我无法加载所有图像,并将其保存在内存中,所以我很懒惰加载它们。
问题是如果我滚得太快,会出现“黑色图像”(图像无法加载)。
这是延迟加载代码:
int currentImageToLoad = [self calculateWhichImageShowing] + imageBufferZone;
[(UIView*)[[theScrollView subviews] objectAtIndex:0]removeFromSuperview];
PictureObject *pic = (PictureObject *)[imageList objectAtIndex:currentImageToLoad];
MyImageView *iv = [[MyImageView alloc] initWithFrame:CGRectMake(currentImageToLoad * 320.0f, 20.0f, 320.0f, 460)];
NSData *imageData = [NSData dataWithContentsOfFile:[pic imageName]];
[iv setupView:[UIImage imageWithData: imageData] :[pic imageDescription]];
[theScrollView insertSubview:iv atIndex:5];
[iv release];
MyImageView *iv = [[MyImageView alloc] initWithFrame:CGRectMake(currentImageToLoad * 320.0f, 20.0f, 320.0f, 460)];
NSData *imageData = [NSData dataWithContentsOfFile:[pic imageName]];
[iv setupView:[UIImage imageWithData: imageData] :[pic imageDescription]];
[theScrollView insertSubview:iv atIndex:5];
[iv release];
这是scrollViewWillBeginDecelerating:
中的代码
[NSThread detachNewThreadSelector:@selector(lazyLoadImages) toTarget:self withObject:nil];
答案 0 :(得分:2)
为什么willbegindecelerating方法中的代码?最好将它放在scrolviewdidscroll方法中,以便尽快开始加载。
您不应该修改单独线程中的任何视图,因为视图图形不是线程安全的
图像是真的存储为文件中的数据还是图像文件?如果是图像文件,请使用[UIImage imageNamed:]加载它们,因为此刻您正在执行2次转换。如果它们是数据,我建议您在首次显示scollview时在单独的线程上为大多数创建UIImages,以便在需要将它们添加到滚动视图时准备好它们。