Platzieren eines NSTimers in einem separaten Thread

8

Hinweis: Es lohnt sich wahrscheinlich, nach unten zu scrollen, um meinen Schnitt zu lesen.

Ich versuche, einen NSTimer in einem separaten Thread einzurichten, so dass er weiterhin ausgelöst wird, wenn Benutzer mit der Benutzeroberfläche meiner Anwendung interagieren. Das scheint zu funktionieren, aber Leaks meldet eine Reihe von Problemen - und ich glaube, ich habe es auf meinen Timer-Code beschränkt.

Gegenwärtig versucht updateTimer, auf einen NSArrayController (timersController) zuzugreifen, der an eine NSTableView in meiner Anwendungsschnittstelle gebunden ist. Von dort greife ich die erste ausgewählte Zeile und ändere ihre timeSpent-Spalte. Hinweis: Der Inhalt von timersController ist eine Sammlung von verwalteten Objekten, die über Core Data generiert werden.

Ich glaube, während des Lesens sollte ich versuchen, die updateTimer-Funktion im Hauptthread auszuführen, und nicht im sekundären Thread meiner Timer.

Ich poste hier, in der Hoffnung, dass jemand mit mehr Erfahrung mir sagen kann, ob das das Einzige ist, was ich falsch mache. Nachdem ich Apples Dokumentation über Threading gelesen habe, habe ich festgestellt, dass es ein überwältigend großer Themenbereich ist.

%Vor%

AKTUALISIEREN

Ich bin immer noch völlig verloren in Bezug auf dieses Leck. Ich weiß, dass ich offensichtlich etwas falsch mache, aber ich habe meine Bewerbung auf das Wesentliche reduziert und finde sie immer noch nicht. Aus Gründen der Einfachheit habe ich meinen Anwendungscontroller-Code auf ein kleines Pastebin hochgeladen. Beachten Sie, dass ich den Timer-Thread-Code jetzt entfernt habe und stattdessen den Timer in einem separaten Runloop ausführen möchte (wie hier vorgeschlagen).

Wenn ich die Leaks-Aufruf-Struktur so eingestellt habe, dass sowohl fehlende Symbole als auch Systembibliotheken ausgeblendet werden, wird mir folgende Ausgabe angezeigt:

BEARBEITEN: Links zu Screenshots unterbrochen und daher entfernt.

    
ndg 26.04.2010, 18:22
quelle

1 Antwort

51

Wenn der einzige Grund dafür, dass Sie einen neuen Thread erstellen, darin besteht, dass der Timer ausgeführt wird, während der Benutzer mit der Benutzeroberfläche interagiert, können Sie ihn einfach in verschiedenen Runloop-Modi hinzufügen:

%Vor%

Als Ergänzung zu dieser Antwort ist es jetzt möglich, Timer mit Grand Central Dispatch und Blöcken zu planen:

%Vor%

Später, wenn der Timer nicht mehr benötigt wird:

%Vor%     
sbooth 26.04.2010, 20:25
quelle

Tags und Links