我的程序从左到右显示一个水平滚动的表面,由多个UIImageView平铺。为了确保新出现的UIImageView具有新加载的UIImage,代码在UI线程上运行。加载过程在后台线程中进行。
除了每个图像变得可见时会出现卡顿外,一切都几乎正常。起初我以为我的后台工作线程锁定了UI线程中的某些内容。我花了很多时间分析它,并最终意识到,当首次显示UIImage时,它会在UI线程上进行一些额外的懒处理。这让我感到困惑,因为我的工作线程有明确的用于解压缩JPEG数据的代码。
不管怎样,出于直觉,我编写了一些代码在后台线程上渲染到临时图形上下文中,结果,卡顿问题消失了。UIImage现在在我的工作线程上被预加载。目前为止好极了。
问题在于我的新的“强制懒加载图片”方法不可靠。它导致间歇性的EXC_BAD_ACCESS错误。我不知道UIImage在幕后实际做了什么。也许它正在解压缩JPEG数据。无论如何,该方法是:
除了每个图像变得可见时会出现卡顿外,一切都几乎正常。起初我以为我的后台工作线程锁定了UI线程中的某些内容。我花了很多时间分析它,并最终意识到,当首次显示UIImage时,它会在UI线程上进行一些额外的懒处理。这让我感到困惑,因为我的工作线程有明确的用于解压缩JPEG数据的代码。
不管怎样,出于直觉,我编写了一些代码在后台线程上渲染到临时图形上下文中,结果,卡顿问题消失了。UIImage现在在我的工作线程上被预加载。目前为止好极了。
问题在于我的新的“强制懒加载图片”方法不可靠。它导致间歇性的EXC_BAD_ACCESS错误。我不知道UIImage在幕后实际做了什么。也许它正在解压缩JPEG数据。无论如何,该方法是:
+ (void)forceLazyLoadOfImage: (UIImage*)image
{
CGImageRef imgRef = image.CGImage;
CGFloat currentWidth = CGImageGetWidth(imgRef);
CGFloat currentHeight = CGImageGetHeight(imgRef);
CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat scaleRatioX = bounds.size.width / currentWidth;
CGFloat scaleRatioY = bounds.size.height / currentHeight;
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scaleRatioX, -scaleRatioY);
CGContextTranslateCTM(context, 0, -currentHeight);
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, CGRectMake(0, 0, currentWidth, currentHeight), imgRef);
UIGraphicsEndImageContext();
}
而 EXC_BAD_ACCESS 发生在 CGContextDrawImage 行上。问题1:我是否允许在非UI线程中执行此操作?问题2:UIImage 实际上正在“预加载”什么?问题3:解决此问题的官方方法是什么?
感谢您阅读所有内容,任何建议将不胜感激!