Я разрабатываю приложение с галереей. Все изображения находятся на диске устройства (каталог документов), но я не могу отобразить его плавно.Плохая производительность с UIImageView (для локальных изображений)
Поскольку некоторые изображения большие (2000px * 2000px), я загружаю их в фоновый поток, уменьшаю их и отображаю на главной теме.
Вот мое расширение UIImageView:
@implementation UIImageView (BackgroundResize)
- (void)localImageFromPath: (NSString *) path scaledTo: (CGSize) size {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(queue, ^{
//Load image
NSData * imgData = [[NSData alloc] initWithContentsOfFile:path];
UIImage * original = [[[UIImage alloc] initWithData:imgData] autorelease];
[imgData release];
CGSize imgSize = original.size;
float widthScale = size.width/imgSize.width;
float heightScale = size.height/imgSize.height;
float scaleFactor = widthScale;
if (heightScale < scaleFactor) {
scaleFactor = heightScale;
}
UIImage * result = nil;
//Scale if necessary
if (scaleFactor < 1.0) {
result = [[UIImage alloc] initWithCGImage:original.CGImage scale:1/scaleFactor orientation:original.imageOrientation];
} else {
result = [original retain];
}
NSLog(@"Image prepeared on backgroud thread, update ui image on main..");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Begin updating image on main thread");
self.image = result;
[result release];
[[NSNotificationCenter defaultCenter] postNotificationName:NTF_IMG_LOADED object:self];
NSLog(@"Updated");
});
});
dispatch_release(queue);
}
@end
В консоли вывода все кажется идеальным, все строки отладки отображаются менее чем за 1 сек (6 очень больших изображений), но интерфейс блокируется, и отображаются изображения с задержкой в 10 секунд.
Каков правильный подход для отображения больших локальных изображений на iOS?
App построен для iOS5 + ..
Спасибо,
Почему вы выпускаете 'результат'? Вы проверяли, когда поступит уведомление? –
Мы не используем ARC, результат - несколько строк выше сохраненных/выделенных, поэтому я должен его освободить. Уведомление приходит немедленно, за 10 секунд до фактического отображения изображения. – miham