UIGraphicsBeginImageContextWithOptions und Multithreading
Ich bin ein wenig verwirrt über UIGraphicsBeginImageContextWithOptions
und threading, da nach UIKit-Funktion Referenz UIGraphicsBeginImageContextWithOptions
sollte nur aufgerufen werden, auf dem Haupt-thread. Wenn man es schafft eine bitmap-basierten-Kontext, die bereit sind, manipuliert werden, entweder mit CoreGraphics' - Funktionen oder mit Methoden wie -drawInRect:
für UIImage
, -drawInRect:withFont:
für NSString
und so weiter. Für CoreGraphics' Zeichnung ist alles klar - Sie passieren eine CGContextRef argument, dass manipuliert wird, um jede Funktion, aber die UIKit-Zeichnung Methoden der aktuelle Kontext in dem Stapel. In den release notes der Was ist Neu in iOS 4.0 geschrieben, dass
Zeichnen auf einem Grafik-Kontext, in UIKit ist jetzt thread-safe. Insbesondere:
- Die Routinen für Zugriff und Manipulation von Grafiken
der Kontext kann jetzt richtig handle, die sich in unterschiedlichen Kontexten
Gewinde.
- String und Bild, die Zeichnung ist jetzt thread-safe.
- Über die Farbe und
font-Objekte in mehreren threads ist jetzt sicher zu tun.
So weit So gut. Der interessante Teil ist, dass ich ein Projekt, wo ich einige intensive Zeichnungen und erstellen mehrere Bilder erstellen Rahmen mit UIGraphicsBeginImageContextWithOptions
, aber wenn diese Operationen geschehen zu sein, mehr Zeit in Anspruch und ich zog die Zeichnung in einem hintergrund-thread und wenn Sie bereit sind, zeigt Sie auf dem Bildschirm mit einigen Animationen und alles funktioniert wunderbar - keine Abstürze, keine Lecks. Bilder zeichnen, wie Sie erwartet werden und es scheint, dass UIGraphicsBeginImageContextWithOptions
schafft einen Kontext für einen hintergrund-thread und alles scheint in Ordnung zu sein.
Also meine Fragen sind:
- Warum es notwendig ist, zu nennen UIGraphicsBeginImageContextWithOptions
nur auf dem Haupt-thread, wie es scheint einwandfrei zu funktionieren im hintergrund?
- Wie zu verwenden UIImage
's -drawInRect:
Methode zum Beispiel in einem hintergrund-thread, wo ich keinen aktuellen Kontext und ich kann nicht scheinen, in der Lage sein, erstellen Sie eines, da kann ich nicht nennen UIGraphicsBeginImageContextWithOptions
gibt es?
- Was ist der richtige Ansatz, um hintergrund-Bildbearbeitung mit UIKit Methoden (ich weiß, ich kann auch mit CGBitmapContextCreate
, aber es weder drückt die erzeugten Kontext in der Kontext-Stapel noch ich scheinen in der Lage sein, es selbst zu tun, um -drawInRect:
Methode der UIImage
)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, nach ein paar Tagen der Untersuchung, wie kommen Sie manipulieren die UIKit Rahmen ist thread-sicher und trotzdem nicht zu sein scheinen in der Lage eines zu erstellen in einem anderen thread als die wichtigsten, weil
UIGraphicsBeginImageContextWithOptions
"genannt werden sollte, nur auf dem Haupt-thread", aber immer noch so tun, funktioniert einwandfrei, und nach der Lektüre einige kleine Beiträge zu dem Thema und diskutieren es mit anderen Jungs auf der Apple-Entwickler-Foren kann ich eindeutig sagen, dass, was gesagt wird in der Dokumentation über dieUIGraphicsBeginImageContextWithOptions
,UIGraphicsPushContext
undUIGraphicsPopContext
ist FALSCH und jene Methoden bezeichnet werden könnte und dem Kontext verwendet, in einem anderen thread, ohne Probleme. SoUIGraphicsBeginImageContextWithOptions
,UIGraphicsPushContext
undUIGraphicsPopContext
sind thread-safe.In iOS 4 and later, you may call this function from any thread of your app.
Teilweise Antwort: Verwenden Sie
UIGraphicsPushContext
zu schieben Ihre eigenen CG-Kontext an die Spitze der "UIKit Rahmen" stack und alles (aus diesem thread, wie ich Sie interpretieren die Dokumentation von Apple) wird Farbe auf, die. Vergessen Sie nicht, verwendenUIGraphicsPopContext
pop es aus dem UIKit Rahmen stack.Diese Feststellung gilt für alle UIKit Zeichnung Operationen; zum Beispiel zeichnen
UIImage
s, wie Sie fragte. Schieben Sie einen Rahmen zeichnen, dann aus dem pop-Kontext.You should call this function from the main thread of your application only.
sowohl fürUIGraphicsPushContext
undUIGraphicsPopContext