2009-05-16 3 views

Antwort

0

Nicht direkt. Wenn Sie performSelector:withObject:afterDelay: verwenden, wird der Selektor auf dem Hauptthread ausgeführt, so per Definition wird es auftreten, nachdem alle aktuellen "ausstehenden" UI-Ereignisse durchgeführt wurden - aber das könnte in der Mitte einer Bildlauf oder Animation sein, die Sie wahrscheinlich würden Betrachten Sie als ein kontinuierliches Ereignis, aber ist eigentlich Hunderte von separaten.

Sie können jedoch etwas Ähnliches erreichen, indem Sie performSelectorInBackground:withObject: verwenden und dann in der aufgerufenen Methode [NSThread setThreadPriority:0.01] aufrufen. Seien Sie vorsichtig - Sie öffnen einen Hintergrund-Thread, sodass Sie keine Benutzeroberflächen-Aufrufe ausführen können. Dies ermöglicht Ihnen jedoch die Arbeit an einem Hintergrund-Thread mit einer niedrigeren Priorität als der Haupt-UI-Thread. (Denken Sie daran, einen Autorelease-Pool einzurichten, da er in einem eigenen Thread ist!)

+0

Danke. Wenigstens kann ich jetzt keinen roten Hering jagen. Ich werde in die Unterdrückung der Animation schauen, da ich einen Verdacht habe, der meine Benutzeroberfläche manchmal nicht mehr anspricht. –

5

Eigentlich muss performSelector:withObject:afterDelay: nicht notwendigerweise auf dem Hauptthread auftreten; deshalb gibt es eine separate Methode performSelectorOnMainThread:withObject:waitUntilDone:. Die Dokumentation für performSelector:withObject:afterDelay: sagt

Ruft eine Methode des Empfängers auf dem aktuellen Thread des Standardmodus nach einer Verzögerung verwendet wird.

Wenn Sie eine Aufgabe im Hintergrund ausführen möchten, können Sie in +[NSThread detachNewThreadSelector:toTarget:withObject:] suchen, die einen neuen Thread starten wird Ihre Aufgabe auszuführen, und lassen Sie die Benutzeroberfläche reaktionsschnell. Die Verwendung eines separaten Threads zum Ausführen einer lang andauernden Aufgabe, die andernfalls Ihre Benutzeroberfläche blockieren könnte, ist im Allgemeinen eine gute Idee, erhöht jedoch die Komplexität. Wenn Sie mit Threading nicht vertraut sind, können Sie mit Fehlern enden, die keinen Sinn ergeben.

In einem Kommentar oben haben Sie erwähnt, dass Sie der Meinung sind, dass die Animation einen Fehler verursachen kann, weil Ihre Benutzeroberfläche nicht mehr reagiert. Wenn Sie die integrierte Unterstützung für Animation (Core Animation oder einen der Cocoa-Wrapper) verwenden, sollte die UI durch die Animation nicht reagieren. Eine nicht reagierende Benutzeroberfläche bedeutet in der Regel, dass Ihr Programm eine Menge Arbeit am Hauptthread ausführt, bevor die Ausführungsschleife zu Servicebenutzeroberflächenereignissen zurückkehren kann.

Verwandte Themen