CoreAnimation warnte gelöschten Thread mit nicht committed CATransaction
Ich habe Probleme mit der folgenden Warnung:
CoreAnimation: warning, deleted thread with uncommitted CATransaction; CA_DEBUG_TRANSACTIONS=1 in der Umgebung log-Ablaufverfolgungen.
Bin ich mit einer NSOperation-Objekt, um einige Berechnungen auszuführen, sobald der Vorgang abgeschlossen ist, sendet es eine Nachricht an den AppDelegate, versteckt sich dann eine Fortschrittsleiste und blendet Sie einige Tasten. Wenn ich kommentiere die Nachricht zurück an den AppDelegate die Warnung geht Weg, aber der Fortschrittsbalken offensichtlich bleibt sichtbar und animiert.
Ich bin mit xCode 4.4.1 und OSX 10.8.1, aber wenn ich kompilieren und den code auszuführen, der mit der gleichen version von xCode auf OSX 10.7.4 ich komme nicht auf die Warnung und der code läuft wie erwartet.
Einstellung der CA_DEBUG_TRANSACTIONS=1 Umgebungsvariable zeigt die Ablaufverfolgung, als käme Sie aus einer NSControl setEnabled Nachricht in der AppDelegate.
Die Antwort ist wahrscheinlich starrte mir in das Gesicht, aber vielleicht habe ich zu viel Kaffee!
InformationsquelleAutor der Frage Milly | 2012-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Vermutungen richtig sind.
Wenn NSOperation abgeschlossen ist, bevor CoreAnimation ist getan durchführen, dann bekommen Sie eine schöne Warnung:
*CoreAnimation: warning, deleted thread with uncommitted CATransaction; CA_DEBUG_TRANSACTIONS=1 in der Umgebung log-Ablaufverfolgungen.*
Dies kann auch geschehen, unter bestimmten Umständen, wenn ein block, der ausgelöst wird, die in einer Warteschlange Trigger einige arbeiten von CoreAnimation und zurückkehrt, bevor die CoreAnimation beendet.
Die Lösung, die ich benutze ist einfach: Auf einem block, oder NSOperation, dass die Anforderungen der Arbeit von CoreAnimation, ich überprüfen, dass die arbeiten tatsächlich abgeschlossen sind, bevor Sie verschwinden.
Geben Sie ein proof-of-concept-Beispiel dies ist ein block ausgelöst, auf eine dispatch-queue. Um zu vermeiden, dass die Warnung, überprüfen wir, dass die CoreAnimation ist, erfolgt vor dem beenden.
InformationsquelleAutor der Antwort Jean
Im Einklang mit standard-Kakao-Paradigmen, die empfohlene Lösung ist hier, um Ihre Core Animation arbeiten auf dem Haupt-thread, die leicht mit GCD:
Im Allgemeinen es ist schlechte form, um nennen Objekte in Kontexten, die Sie nicht erwarten, so dass eine gute Faustregel ist, um immer Versand auf den Haupt-thread, wenn die Zustellung von Nachrichten an externe Module.
Einige frameworks wie Core Location—mit emittieren eine log-Meldung, wenn Sie aufgerufen werden, von jedem anderen Kontext als dem Haupt-thread. Andere emittieren, kryptische Meldungen, wie dein Beispiel hier mit Core Animation.
InformationsquelleAutor der Antwort numist
Anderen Weg, um jede Zeichnung Benutzeroberfläche erfolgt über den Haupt-thread, wie von Numist, ist mit der Methode
performSelectorOnMainThread:withObject:waitUntilDone:
oder alternativperformSelectorOnMainThread:withObject:waitUntilDone:modes:
Für einen entsprechenden post auf den Unterschied zwischen
dispatch_async()
undperformSelectorOnMainThread:withObjects:waitUntilDone:
siehe Was ist der Unterschied zwischen performSelectorOnMainThread und dispatch_async auf der main queue?InformationsquelleAutor der Antwort Dalmazio