Tak, jak wspomniano w this answer aw the iOS 4.0 release notes, UIKit ma teraz jakieś wątku bezpieczny zaplecze rysunek:Rysowanie UIKit jest bezpieczne dla wątków: jak uzyskać kontekst graficzny?
zbliża się do kontekstu graficznego w UIKit jest teraz bezpieczny wątku. W szczególności:
- Procedury używane do uzyskiwania dostępu do kontekstu graficznego i manipulowania nim mogą teraz poprawnie obsługiwać konteksty rezydujące na różnych wątkach.
- Rysowanie rysunków i rysunków jest teraz wątkowo bezpieczne.
- Używanie obiektów kolorowych i czcionek w wielu wątkach jest teraz bezpieczne.
To świetnie, ale jak z niego korzystać?
O ile jestem świadomy, za każdym razem nie jesteś wewnątrz -drawRect:
można jedynie wyciągnąć za pomocą rzeczy UIKit/UIGraphics jeśli utworzyliśmy własny kontekst poprzez UIGraphicsBeginImageContext()
lub UIGraphicsPushContext()
, ale te funkcje nie są wątku bezpieczne zgodnie z dokumentami, i -drawRect()
jest zawsze wywoływana w głównym wątku.
Zakładam, że tworzenie kontekstu obrazu na głównym wątku, a następnie uruchamianie metody tła byłoby złym pomysłem, ze względu na wiele warunków wyścigu.
Jak zatem korzystać z tego wielowątkowego programu do rysowania UIKit, który został wprowadzony w systemie iOS 4? Jakie inne sposoby uzyskania aktywnego kontekstu graficznego UIKit ominęły?
P.S. Wiem, że mogłem po prostu narysować używając Core Graphics i zrobić z tym. Z różnych powodów (dotychczasowy kod) chciałbym nadal korzystać z metod rysowania opartych na UIKit.
Właśnie otworzyłem problem DTS na ten temat, więc mam nadzieję, że stamtąd się dowiem. Rzecz, o której nie wspomniałem w pytaniu, polegała na tym, że w moich próbach (chociaż używałem ... beginImageContext), przez większość czasu wszystko działało dobrze, ale czasami miałem awarię w 'NSString drawInRect: withFont:' . Jest irytująco trudny do odtworzenia, ale kiedy się zawiesza, jest tam. Próbuję się dowiedzieć, czy robię coś źle, czy to po prostu nigdy nie zadziała. –
Nie widziałem wcześniej tego rodzaju awarii, ale nie byłem zbyt agresywny w moich eksperymentach. Jest to dość niepokojące i może sugerować, że moje przekonanie jest nieprawidłowe. Daj nam znać, jaki jest wynik DTS. –
Więcej informacji: konkretną rzeczą, która ulega awarii, jest 'WebCore :: FontFallbackList :: ~ FontFallbackList()()'. –