如何在主线程被阻塞时更新CALayer的内容?
问题描述:
即使在主线程被阻塞的情况下,AVCaptureVideoPreviewLayer的实例仍会从视频捕捉流中更新其内容。是否有可能通常使用CALayer
的自定义子类复制此行为?换句话说,在原始图像数据的情况下,当主线程被阻塞时,我们能够更新屏幕上显示的内容吗?如何在主线程被阻塞时更新CALayer的内容?
答
当主线程被阻塞时,您无法更新视图中的任何内容。整个UIKit是单线程的,并在主事件循环中运行。视频捕捉是一种特殊情况,因为它直接绘制到屏幕缓冲区,但您无法自己复制它。此外,如果您在主线程上执行长时间运行的任务,则iOS会假设您的应用程序崩溃并在几秒钟后终止它。
为什么不在后台线程上执行其他任务呢?这是标准做法。
答
我找到了更新非UI线程上的UI的方法。 我们可以在任何线程中执行代码,并且即使在主线程正在休眠时,它实际上也会更改图层的转换。
self.labelLayer.transform = CATransform3DMakeScale(1.2, 1.2, 1.0);
所以,如果任何人都可以解释这一点,请随时连接我!
CATiledLayer被设计为在后台线程中工作。 – 2012-02-03 20:30:07
不完全。它将图像切片加载到后台线程上,但仍将其绘制在主线程上。 – 2012-02-03 20:38:58