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