[英]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];
}
谢谢
您可以考虑以下几点:
instruments tool
的time profiler
检查大部分时间。 UIImageView
代替UIImage
来应用一些变换,例如旋转和变换。 您需要将这些转换应用于UIImageView的CALayer。 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.