2

我有这个图像渲染功能,当我渲染它时,它会导致主/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];

}

谢谢

4

2 回答 2

3

您可以考虑以下几点:

  1. 使用. time profiler_instruments tool
  2. 使用 ofUIImageView而不是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);
于 2012-09-23T21:40:17.043 回答
2

您是否尝试使用 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 的并发编程指南

于 2012-09-23T21:38:40.823 回答