CGImage / UIImage ленивая загрузка в потоке пользовательского интерфейса вызывает заикание

Моя программа отображает горизонтальную прокручиваемую поверхность, покрытую UIImageViews слева направо. Код выполняется в потоке пользовательского интерфейса, чтобы гарантировать, что для вновь видимых UIImageView назначен только что загруженный UIImage. Загрузка происходит в фоновом потоке.

Все работает почти нормально, за исключением заикания, когда каждое изображение становится видимым. Сначала я думал, что мой фоновый работник что-то блокирует в потоке пользовательского интерфейса. Я потратил много времени на его просмотр и в конце концов понял, что 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: Могу ли я сделать это в потоке, отличном от потока пользовательского интерфейса? ВОПРОС 2: Что такое UIImage на самом деле "перед загрузкой»? ВОПРОС 3: Какой официальный способ решить эту проблему?

Спасибо за чтение всего этого, любой совет будет принята с благодарностью!

Ответы на вопрос(4)

Ваш ответ на вопрос