2012-07-06 9 views
7

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.)

+0

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

+0

Czy reguły gwintowania dotyczą również modyfikacji lub odczytu obiektu? – Snowman

+0

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

Odpowiedz

7

Graphics Core i Core Animation będąc API niskiego poziomu, są ogólnie wątku bezpieczne. Jednak nadal obowiązują te same zasady dotyczące dostępu: Żadna praca nie może być dostępna dla więcej niż jednego wątku w tym samym czasie, w przeciwnym razie rysunek się nie powiedzie, a twoja aplikacja ulegnie awarii. Byłbym ostrożny (ale nie bałam się) UIImage, ponieważ obiekty UIKit nie są po prostu bezpieczne w wątkach, w zasadzie tykają bomby zegarowe w wątkach tła i bez problemu zejdą prosto z klifu do Wyjątkowej Krainy. Ponieważ jednak UIImage jest tylko opakowaniem CGImage, ponownie większość rysunków jest bezpieczna dla wątków.

+0

Czy istnieje zatem sprytna alternatywa dla zrzutu ekranu w tle? Co powiesz na używanie NSData w wątku bg i używanie go do budowania obrazu w głównym wątku? – Snowman

+0

Zrzuty ekranu w tle? Nie jest możliwe bez IOSurface, o którym Apple jest teraz w pełni świadomy dzięki Display Recorder, jednak jeśli to nie ma znaczenia, zobacz [tutaj] (http://stackoverflow.com/questions/11090184/how-does-the- ios-app-display-recorder-record-the-screen-without-using-private-ap /). – CodaFi

+0

Nie w tle tła - wątek w tle mam na myśli .. – Snowman

Powiązane problemy