2012-03-31 8 views
8

Quindi, come detto in this answer e in the iOS 4.0 release notes, UIKit ha ora alcuni thread-safe strutture disegno:Il disegno UIKit è thread-safe: come si ottiene un contesto grafico?

volge al contesto grafico in UIKit è ora thread-safe. In particolare:

  • Le routine utilizzate per accedere e manipolare il contesto grafico ora possono gestire correttamente i contesti che risiedono su thread diversi.
  • Lo string e il disegno dell'immagine ora sono thread-safe.
  • L'utilizzo di colori e oggetti font in più thread è ora sicuro.

È fantastico, ma come si usa?

Per quanto ne sono a conoscenza, in qualsiasi momento tu non sei dentro -drawRect: è possibile disegnare usando solo la roba UIKit/UIGraphics se hai creato il proprio contesto attraverso UIGraphicsBeginImageContext() o UIGraphicsPushContext(), ma quelle funzioni non sono thread-safe secondo i documenti, e -drawRect() viene sempre chiamato sul thread principale.

Suppongo che la creazione di un contesto di immagine sul thread principale e l'avvio del metodo di background sarebbe una pessima idea, a causa delle condizioni di gara in abbondanza.

Quindi, come faccio a utilizzare questo materiale di disegno basato su UIKit con multithread introdotto in iOS 4? Quali altri modi di ottenere un contesto grafico Uikit attivo mi sono perso?

P.S. So che potrei disegnare usando la grafica core e averne fatto. Per vari motivi (codice precedente) mi piacerebbe continuare a utilizzare i metodi di disegno basati su UIKit.

risposta

8

La mia convinzione, basata su alcune esperienze provandolo e basata su vari documenti, è che i documenti per UIGraphicsPushContext() non sono corretti.

Credo che lo standard UIGraphicsPushContext() sia thread-safe. L'indicazione particolare che questo è vero è QA1637, che dice "A partire da iOS 4.0, il disegno in un contesto grafico in UIKit è thread-safe .Questo include l'accesso e la manipolazione dello stack grafico corrente, il disegno di immagini e stringhe e l'uso di colore e oggetti font dai thread secondari. " (sottolineatura mia)

Riconosco che è sempre una proposta azzardata assumere la sicurezza del filo in contraddizione con i documenti. Ma credo che questo sia un errore di documentazione. Ho aperto rdar://11161530 per seguirlo. Per favore, duplica.

+0

In realtà ho appena aperto un problema DTS a riguardo, quindi spero di scoprirlo da lì. La cosa che non ho menzionato nella domanda era che nelle mie prove (anche se stavo usando ... beginImageContext), la maggior parte delle volte le cose stavano andando bene, ma a volte stavo andando in crash in 'NSString drawInRect: withFont:' . È fastidiosamente non facilmente riproducibile, ma ogni volta che si blocca è lì. Sto cercando di capire se sto facendo qualcosa di sbagliato o se questo non funzionerà mai. –

+0

Non avevo mai visto quel tipo di incidente prima, ma non sono stato eccessivamente aggressivo nei miei esperimenti. Questo è abbastanza inquietante e potrebbe suggerire che la mia convinzione non sia corretta. Fateci sapere qual è il risultato DTS. –

+0

Ulteriori informazioni: la cosa specifica che si blocca è 'WebCore :: FontFallbackList :: ~ FontFallbackList()()'. –

Problemi correlati