Загрузка UIImage в фоновом потоке вызывает ошибку ImageIO
Я работаю над проектом iOS, который загружает UIImages из URL в фоновом потоке и отображает их в виде горизонтальной прокрутки. Такое поведение должно имитировать поведение приложения для библиотеки фотографий для iPhone. У меня все настроено так, что, я считаю, должно работать, но при отрисовке UIImages в основном графическом контексте пользовательского интерфейса я иногда вижу, как это сообщение распечатывается в консоли:
ImageIO: <ERROR> CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x685e590]
Несмотря на эту ошибку, кажется, что приложение работает отлично и что изображения отрисовываются, как и ожидалось. Должен ли я просто игнорировать это «ОШИБКА», или я должен изменить свой метод загрузки изображений в фоновом потоке? В настоящее время я загружаю изображение в фоновом потоке, используя UIImageinitWithData:
метод:
- (void)backgroundLoadThread:(NSURL *)url {
@autoreleasepool {
NSData * imageData = [NSData dataWithContentsOfURL:url];
UIImage * theImage = [[UIImage alloc] initWithData:imageData];
if ([[NSThread currentThread] isCancelled]) {
#if !__has_feature(objc_arc)
[theImage release];
#endif
return;
}
[self performSelectorOnMainThread:@selector(loadComplete:)
withObject:theImage waitUntilDone:NO];
}
}
мойloadComplete:
Метод просто сохраняет изображение, переданное в качестве переменной экземпляра, которая впоследствии рисуется в представленииdrawRect:
метод. ВdrawRect:
Я использую UIImagedrawInRect:
метод, который, по-видимому, является виновником сообщения об ошибке в консоли. Тем не менее, рисование лежащего в основе изображения CGImageRef с помощьюCGContextDrawImage
по-прежнему вызывает ту же ошибку. Полный исходный код можно найти в репозитории Github этого проекта, в файлеANAsyncImageView.m.
РЕДАКТИРОВАТЬ: Теперь я изменил фоновый поток, чтобы загрузить CGImage из файла, а затем обратный вызов в основной поток, передавая CGImageRef с использованием бесплатного моста. К сожалению, это все еще создает ту же проблему, доказывая мне, что UIImageimageWithCGImage:
должен каким-то образом сохранить ссылку на оригинальный CGImage. Проверьте код в файле, связанном выше (с репозиторием Github) для полного кода:
NSData * imageData = [NSData dataWithContentsOfURL:url];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)imageData);
CGImageRef loaded = CGImageCreateWithPNGDataProvider(provider, NULL, false, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
id imageObj = (id)loaded;
[self performSelectorOnMainThread:@selector(loadComplete:) withObject:imageObj waitUntilDone:NO];
CGImageRelease(loaded);