繁体   English   中英

如何在不阻止UI的情况下渲染图像?

[英]How to render images without blocking UI?

我具有此图像渲染功能,正在渲染时导致主/ UI线程阻塞/卡死。

有哪些方法可以在iOS中不阻塞线程并在其他线程上渲染? 有本地API可以帮助您吗?

更新的代码:

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

function
{
    UIImage *shrinkedImage = [ThisClass imageWithImage:screenShotImage scaledToSize:shrinkImageToSize];

    UIImage * rotatedImage = [[UIImage alloc] initWithCGImage: shrinkedImage.CGImage
                                                        scale: 1.0
                                                  orientation: UIImageOrientationRight];

}

谢谢

您可以考虑以下几点:

  1. 使用instruments tooltime profiler检查大部分时间。
  2. 利用UIImageView代替UIImage来应用一些变换,例如旋转和变换。 您需要将这些转换应用于UIImageView的CALayer。
  3. 使用GCD将图像的加载置于后台线程中。 这是一个例子:
 dispatch_queue_t preloadQueue = dispatch_queue_create("preload queue", nil); dispatch_async(preloadQueue, ^{ UIImage *yourImage = [UIImage imageNamed:yourImageReferencePath]; dispatch_async(dispatch_get_main_queue(), ^{ yourUIView.image = yourImage}); }); dispatch_release(preloadQueue); 

您是否尝试过使用GCD在后台执行任务?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    // Do your computations in the global queue (background thread)
    UIImage *shrinkedImage = [ThisClass imageWithImage:screenShotImage scaledToSize:shrinkImageToSize];
    UIImage * rotatedImage = [[UIImage alloc] initWithCGImage: shrinkedImage.CGImage
                                                        scale: 1.0
                                                  orientation: UIImageOrientationRight];
    // Once done, always do all your display operations to update the UI on the main thread
    dispatch_sync(dispatch_get_main_queue(), ^{
        yourImageView.image = rotatedImage;
    });
});

有关更多信息,请阅读《 Apple 并发编程指南》

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM