2017-01-16 10 views
0

Я создал этот метод для изменения размера изображения.Multi thread uiimage resize error

+ (UIImage *)imageFromImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

Все работает отлично, но если я называю этот метод в другом потоке он выходит из строя на drawInRect:

Я использую эти строки для вызова этого метода в другом потоке:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    for (int i = 0; i < [images count]; i++){ 

     UIImage *img = [UIImage imageWithContentsOfFile:[images objectAtIndex:i]]; 
     CGFloat wImg = img.size.width * imageViewSize/img.size.height; 
     CGSize size = CGSizeMake(wImg, imageViewSize); 
     img = [Utility imageFromImage:img scaledToSize:size]; 

    } 
}); 

Как может я делаю?

+0

Вы должны вызвать материал пользовательского интерфейса в главной очереди. – shallowThought

+0

поэтому я не могу сделать какой-либо процесс изображения в фоновом режиме? – Pol

ответ

1

Как уже говорилось, будьте осторожны с классами пользовательского интерфейса из других потоков, кроме основного. Вместо этого попробуйте использовать Core Graphics.

Изменить эту строку:

[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 

к:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextConcatCTM(context, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, newSize.height), 1.f, -1.f)); 
CGContextDrawImage(context, CGRectMake(0, 0, newSize.width, newSize.height), image.CGImage); 

Вторая линия будет переворачивать Y-оси, так что он работает как UIKit DrawInRect.

+0

Все работает отлично! – Pol

0

Как правило, всегда делайте материал UI на основной теме.

Для получения более подробной информации, что может быть сделано в фоне, вы должны тщательно проверить документацию:

Не все классы UIKit являются поточно. Обязательно проверьте документацию перед выполнением связанных с рисованием операций над потоками, отличными от основного потока вашего приложения.

От Apples documentation.

В соответствии с this answer поведение, по-видимому, является версией iOS.