2012-03-31 18 views
8

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.

Odpowiedz

8

Moja wiara, oparta na pewnym doświadczeniu próbującym ją i opartym na różnych dokumentach, jest taka, że ​​dokumenty dla UIGraphicsPushContext() są niepoprawne.

Wierzę, że UIGraphicsPushContext() jest w rzeczywistości bezpieczny dla wątków. Szczególne wskazanie, że jest to prawdą, to QA1637, które mówi: "Począwszy od iOS 4.0, rysowanie do kontekstu graficznego w UIKit jest bezpieczne dla wątków, w tym uzyskiwania dostępu i manipulowania bieżącym stosem graficznym, rysowaniem obrazów i łańcuchów oraz wykorzystaniem obiekty koloru i czcionki z wątków wtórnych. " (podkreślenie moje)

Przyznaję, że zawsze jest to ryzykowna propozycja, by zakładać bezpieczeństwo gwintu w sprzeczności z dokumentami. Ale uważam, że jest to błąd dokumentacji. Otworzyłem rdar://11161530, aby go śledzić. Proszę dupe.

+0

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

+0

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

+0

Więcej informacji: konkretną rzeczą, która ulega awarii, jest 'WebCore :: FontFallbackList :: ~ FontFallbackList()()'. –

Powiązane problemy