2012-02-03 37 views
1

即使在主线程被阻塞的情况下,AVCaptureVideoPreviewLayer的实例仍会从视频捕捉流中更新其内容。是否有可能通常使用CALayer的自定义子类复制此行为?换句话说,在原始图像数据的情况下,当主线程被阻塞时,我们能够更新屏幕上显示的内容吗?如何在主线程被阻塞时更新CALayer的内容?

+0

CATiledLayer被设计为在后台线程中工作。 – 2012-02-03 20:30:07

+1

不完全。它将图像切片加载到后台线程上,但仍将其绘制在主线程上。 – 2012-02-03 20:38:58

回答

3

当主线程被阻塞时,您无法更新视图中的任何内容。整个UIKit是单线程的,并在主事件循环中运行。视频捕捉是一种特殊情况,因为它直接绘制到屏幕缓冲区,但您无法自己复制它。此外,如果您在主线程上执行长时间运行的任务,则iOS会假设您的应用程序崩溃并在几秒钟后终止它。

为什么不在后台线程上执行其他任务呢?这是标准做法。

+0

+1很好的答案。 – Till 2012-02-03 21:27:49

+0

我讨厌它,当它可以做某事,但苹果有意限制它......谢谢你的答案 - 我需要知道的一切。 – Anton 2012-02-03 22:42:58

+0

我不确定这是一个例子 - 多线程的用户界面很难做,很少有操作系统 - 但很高兴答案帮助! – 2012-02-04 00:16:36

0

我找到了更新非UI线程上的UI的方法。 我们可以在任何线程中执行代码,并且即使在主线程正在休眠时,它实际上也会更改图层的转换。

self.labelLayer.transform = CATransform3DMakeScale(1.2, 1.2, 1.0); 

所以,如果任何人都可以解释这一点,请随时连接我!

相关问题