CALayer.contents нарисован в потоке пользовательского интерфейса? - PullRequest
2 голосов
/ 11 августа 2011

Можете ли вы подтвердить, что установка свойства CALayer.contents с CGImageRef в фоновом потоке по-прежнему заставляет базовую анимацию рисовать изображение содержимого в цикле основного потока (который является потоком пользовательского интерфейса), а не в основном потоке анимации или в пользовательском фоновом потоке, который устанавливает свойство содержимого?

Причина, по которой я спрашиваю это, состоит в том, что базовая анимация запускает свой собственный поток, но, тем не менее, кажется, что когда вы устанавливаете свойство CALayer.contents, поток пользовательского интерфейса выполняет рисование в слой?

1 Ответ

2 голосов
/ 12 августа 2011

По моему опыту, если у вас есть видимый слой и вы установили содержимое в фоновом потоке, скорее всего, он не будет рисоваться сразу.Решением, которое я использовал, было асинхронное задание свойства содержимого с помощью вызова dispatch_async () в главном потоке:

dispatch_async(dispatch_get_main_queue(), ^(void) {
    layer.contents = (id)myCGImage;
});

В частности, мой пример здесь для работы с потоками с использованием GCD, где сам потокможет долго переживать операцию, которую вы выполняете.В этом случае размещение назначения в главном потоке или принудительная очистка [CATransaction] являются двумя способами указать ОС, что вы хотите, чтобы эти данные были представлены пользователю.

В противном случае, в случаефонового потока GCD, вы находитесь во власти цикла выполнения потока, который может не выполнять [очистку CATransaction] в течение длительного времени (по моему опыту, в секундах).

...