wiem, że to bezpieczne, aby zwrócić na każdym wątku tak długo, jak ja to nazywamCzy ten wątek kodu Core Graphics jest bezpieczny?
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();
w tym samym wątku.
Wykonanie zrzutu ekranu za pomocą tej metody trwa około 300 ms, co nie jest złe, ale jestem w trudnej sytuacji, więc chcę to zrobić w wątku tła.
Oto co robię:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
Jedyną rzeczą tutaj mowa jest view
, która leży na głównym wątku. Czy można bezpiecznie wywołać renderInContext
na view.layer
z wątku tła? Lub ogólnie, czy można bezpiecznie odczytać obiekt UIKit z innego wątku?
(Proszę, nie podawaj mi domyślnej odpowiedzi "UIKit nie jest bezpieczna dla wątków" Już wiem, że to jest specjalny przypadek (i nie mów mi, że nie ma specjalnych przypadków).
(powyższy kod działa dobrze, ale nie jestem pewien, czy to tylko zbieg okoliczności.)
Nie sądzę, że otrzymasz ostateczną odpowiedź na to pytanie, ponieważ nigdzie w dokumentacji Apple nie określi niczego poza 'UIKit nie jest bezpieczny dla wątków' (wraz z wymienionymi wyjątkami). Otrzymasz opinie i doświadczenia od innych ludzi, ale jak już powiedziałeś, powyższy kod działa dobrze, ale kto powie, że zawsze tak będzie, a nawet jeśli ktoś inny ci to powie, prawda? – Rog
Czy reguły gwintowania dotyczą również modyfikacji lub odczytu obiektu? – Snowman
A jeśli zrobię kopię tego widoku wcześniej, to jestem pewien, że jestem tą metodą, która jako jedyna ma dostęp do tej nowej kopii? – Snowman