【问题标题】:Multi thread uiimage resize error多线程uiimage调整大小错误
【发布时间】:2017-01-16 08:47:40
【问题描述】:

我创建了这个方法来调整图像的大小。

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

    }
});

我该怎么办?

【问题讨论】:

  • 你必须在主队列中调用 UI 的东西。
  • 所以我不能在后台进行任何图像处理?

标签: objective-c multithreading io uiimage


【解决方案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 一样工作。

【讨论】:

    【解决方案2】:

    根据经验:总是在主线程上做 UI 工作。

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

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

    来自Apples documentation

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      相关资源
      最近更新 更多