У меня есть фоновый поток, который загружает изображения и отображает их в основном потоке. Я заметил, что фоновый поток почти ничего не может сделать, потому что фактическое декодирование изображения, по-видимому, выполняется в основном потоке:
До сих пор Ive пыталась называть [UIImage imageNamed:]
, [UIImage imageWithData:]
и CGImageCreateWithJPEGDataProvider
в фоновом потоке без разницы. Есть ли способ заставить декодирование выполняться в фоновом потоке?
Theres уже аналогичный вопрос здесь, но это не помогает. Как я писал там, я попробовал следующий трюк:
@implementation UIImage (Loading)
- (void) forceLoad
{
const CGImageRef cgImage = [self CGImage];
const int width = CGImageGetWidth(cgImage);
const int height = CGImageGetHeight(cgImage);
const CGColorSpaceRef colorspace = CGImageGetColorSpace(cgImage);
const CGContextRef context = CGBitmapContextCreate(
NULL, /* Where to store the data. NULL = don’t care */
width, height, /* width & height */
8, width * 4, /* bits per component, bytes per row */
colorspace, kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);
CGContextRelease(context);
}
@end
Это работает (заставляет декодировать изображение), но также вызывает дорогостоящий вызов ImageIO_BGR_A_TO_RGB_A_8Bit
.