Экземпляр AVCaptureVideoPreviewLayer продолжает обновлять его содержимое из потока видеозахвата, даже если основной поток заблокирован. Можно ли в целом повторить это поведение с помощью пользовательского подкласса CALayer
? Другими словами, учитывая данные необработанного изображения, можем ли мы обновить то, что отображается на экране, когда основной поток заблокирован?Как обновить содержимое CALayer, когда основной поток заблокирован?
ответ
Вы не можете обновить что-либо в представлении, когда основной поток заблокирован. Весь UIKit является однопоточным и работает в цикле основного события. Видеозахват является особым случаем, потому что он напрямую обращается к буферу экрана, но вы не сможете его реплицировать самостоятельно.
Кроме того, если вы выполняете долгосрочную задачу в основном потоке, iOS предположит, что ваше приложение разбилось и убило его через несколько секунд.
Почему бы не выполнить другую задачу вместо фона? Это стандартная практика.
+1 Хороший ответ. – Till
Ненавижу, когда можно что-то сделать, но Apple намеренно ограничивает это ... Спасибо за ответ - все, что мне нужно было знать. – Anton
Я не уверен, что это пример того, что многопоточный пользовательский интерфейс трудно сделать, и у немногих ОС есть его, но рад, что ответ помог! –
Я нашел способ обновить интерфейс для не-UI-Thread. Мы можем исправить код в любом потоке, и он фактически изменяет преобразование слоя, даже когда основной поток спал.
self.labelLayer.transform = CATransform3DMakeScale(1.2, 1.2, 1.0);
Так что, если кто-нибудь может это объяснить, пожалуйста, свяжитесь со мной!
CATiledLayer - это дизайн для работы в фоновом режиме. –
Не совсем. Он загружает плитки изображения в фоновый поток, но все же рисует их на основном потоке. –