Ich muss garantieren, dass der gleiche Thread verschiedene Aktionen zu beliebigen Zeiten ausführt. Zuerst muss der Thread eine Bibliothek initialisieren, dann möchte ich den Thread in den Ruhezustand versetzen, bis die Arbeit erledigt ist, und nach der Benutzereingabe muss ich in der Lage sein, Selektoren oder Blöcke zur Ausführung zu übergeben.Wie können Selektoren oder Blöcke an einen NSRunLoop gesendet werden?
Wie kann ich einen NSRunLoop einrichten, um nach der Initialisierung zu schlafen? Wie kann ich der Run-Schleife signalisieren, dass sie aufwacht und etwas unternimmt?
Ich habe versucht, das Threading-Programmierhandbuch für iOS zu lesen, aber ich mag Klassen Eingangsklassen als individueller Einrichtung vermeiden und etwas leichter verwenden wie performSelector:onThread:
Kann ich einen Timer einstellen, für immer Feuer ab jetzt läuft die Laufschleife nicht?
Hier ist im Wesentlichen, was ich in Pseudo-Code will:
// Initialization Code...
do {
sleepUntilSignaled();
doWorkSentToThisThread();
while (!done);
Wo ich die Arbeit schicken als performSelector:onThread:
Nachricht zu tun. Es wäre noch besser, wenn ich der Laufschleife einen Block wie: ^{[someObj message]; [otherObj otherMsg];}
senden könnte, aber ich wäre glücklich mit performSelector
, da ich mir ziemlich sicher bin, dass das ohne viel extra Codierung möglich ist.
Danke!
Danke für die Codebeispiele! Ich habe ursprünglich eine Dispatch-Warteschlange verwendet, aber es wird nicht den gleichen Thread wiederverwendet, wenn zwischen den Versendungen zu viel Zeit ist. –
Ja, das stimmt. Aber es ist nicht wirklich wichtig, es sei denn, Ihr Bibliothekscode hängt davon ab, in welchem Thread er ausgeführt wird.Dies ist normalerweise nicht der Fall. Auch wenn Ihre Bibliothek sagt, dass es nicht threadsicher ist, spielt dies keine Rolle, solange es nicht von mehr als einem Thread * gleichzeitig aufgerufen wird *. Und das wird nie mit einer seriellen Warteschlange passieren. – Sven
Die Bibliothek, die ich benutze, ist PJSUA und wenn es Assertions fehlschlägt, wenn es feststellt, dass ein aufrufender Thread anders ist als der initialisierende Thread :( –