多线程uiimage调整大小错误

时间:2017-01-16 08:47:40

标签: objective-c multithreading io uiimage

我已创建此方法来调整图片大小。

+ (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];

    }
});

我该怎么办?

2 个答案:

答案 0 :(得分:1)

如前所述,请注意除主线程之外的其他线程的UI类。请尝试使用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一样工作。

答案 1 :(得分:0)

根据经验:总是在主线程上做UI内容。

有关可以在后台完成的详细信息,您必须仔细检查文档:

  

并非所有UIKit类都是线程安全的。在对应用程序主线程以外的线程执行与绘图相关的操作之前,请务必查看文档。

来自Apples documentation

根据this answer,行为似乎是iOS版本特定的。