Ich versuche, ein "Offscreen-Rendering" in einem Hintergrund-Thread durchzuführen, um eine Vorschau einer Designer-ähnlichen App, die ich erstelle, zu aktualisieren.
Ich habe renderInContext
in einer NSOperationQueue-abgeleiteten Warteschlange verwendet, um dies zu erreichen, aber beachte, dass es langsam ist.
Also, ich habe drawViewHierarchyInRect
benutzt, was super funktioniert und viel schneller ist. Allerdings habe ich festgestellt, dass meine Benutzeroberfläche vollständig blockiert, wenn diese Methode in der b / g ausgeführt wird.
Wenn ich das im Hauptthread mache ...
%Vor%... alles funktioniert OK.
Allerdings, wenn ich (sagen wir) das versenden ...
%Vor%... meine Benutzeroberfläche friert vollständig nach der Ausführung ein.
'ok' gibt YES zurück, also scheint alles zu funktionieren.
Wenn ich afterUpdates auf NO setze, ist 'ok' NO (fehlgeschlagen), aber die Benutzeroberfläche reagiert weiter.
Gibt es irgendwelche Grenzen bei der Verwendung von drawViewHierarchyInRect, außer dem Hauptthread?
UIKit-Objekte sollten nur im Hauptthread bearbeitet werden. Apples UIKit-Dokumentation erwähnt diesen Spruch
Verwenden Sie in den meisten Fällen nur UIKit-Klassen aus dem Hauptthread Ihrer App. Das ist Dies gilt insbesondere für Klassen, die von UIResponder abgeleitet sind oder die involvieren Manipulieren der Benutzeroberfläche Ihrer App in irgendeiner Weise.
Rufen Sie das obige dispatch_async
vom Hauptthread an? Meine Theorie hier ist, dass Sie [preview drawViewHierarchyInRect:preview.bounds afterScreenUpdates:YES];
mit YES
aufgerufen haben, das Code auf dem Hauptthread ausführen muss, der Hauptthread wird jedoch auf dem Semaphor blockiert. Was Sie wahrscheinlich tun möchten, ist die Ausbeute an den Haupt-Thread hin und wieder, so dass drawViewHierarchyInRect
abgeschlossen werden kann.
Tags und Links multithreading ios screenshot uiview