2012-02-03 3 views
1

Экземпляр AVCaptureVideoPreviewLayer продолжает обновлять его содержимое из потока видеозахвата, даже если основной поток заблокирован. Можно ли в целом повторить это поведение с помощью пользовательского подкласса CALayer? Другими словами, учитывая данные необработанного изображения, можем ли мы обновить то, что отображается на экране, когда основной поток заблокирован?Как обновить содержимое CALayer, когда основной поток заблокирован?

+0

CATiledLayer - это дизайн для работы в фоновом режиме. –

+1

Не совсем. Он загружает плитки изображения в фоновый поток, но все же рисует их на основном потоке. –

ответ

3

Вы не можете обновить что-либо в представлении, когда основной поток заблокирован. Весь UIKit является однопоточным и работает в цикле основного события. Видеозахват является особым случаем, потому что он напрямую обращается к буферу экрана, но вы не сможете его реплицировать самостоятельно.

Кроме того, если вы выполняете долгосрочную задачу в основном потоке, iOS предположит, что ваше приложение разбилось и убило его через несколько секунд.

Почему бы не выполнить другую задачу вместо фона? Это стандартная практика.

+0

+1 Хороший ответ. – Till

+0

Ненавижу, когда можно что-то сделать, но Apple намеренно ограничивает это ... Спасибо за ответ - все, что мне нужно было знать. – Anton

+0

Я не уверен, что это пример того, что многопоточный пользовательский интерфейс трудно сделать, и у немногих ОС есть его, но рад, что ответ помог! –

0

Я нашел способ обновить интерфейс для не-UI-Thread. Мы можем исправить код в любом потоке, и он фактически изменяет преобразование слоя, даже когда основной поток спал.

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

Так что, если кто-нибудь может это объяснить, пожалуйста, свяжитесь со мной!