Ich suche Ratschläge für die Verwendung von NSOperation
und Zeichnung:
Ich habe einen Hauptthread, der meine NSOperation
Unterklasse, die sie dann in eine NSOperationQueue
.
Meine NSOperation
einige schwere Verarbeitung, ist es beabsichtigt, in seiner main()-Methode für mehrere Minuten Schleife, ständig Verarbeitung einige Arbeit, aber für jetzt habe ich nur eine while()-Schleife mit einem sleep(1) innerhalb, die eingestellt ist, um nur 5 Mal (für die Prüfung) gehen.
Das (ursprüngliche) Hauptthema, aus dem dies hervorgeht NSOperation
ist für das Zeichnen zu einer Ansicht und die Aktualisierung der Benutzeroberfläche verantwortlich.
Ich wollte, dass der NSOperation-Thread eine Benachrichtigung verwendet, um dem Hauptthread mitzuteilen, dass er eine gewisse Menge an Verarbeitung durchgeführt hat. Im Moment wird diese Benachrichtigung einmal jedes Mal gesendet, wenn er seine while()-Schleife durchläuft (d.h. einmal pro Sekunde, weil er gerade sleep(1) macht). Der Hauptthread (die Ansicht) registriert sich, um diese Benachrichtigungen zu erhalten.
Die Benachrichtigungen werden sofort an den Hauptthread weitergeleitet und scheinen asynchron zu sein, was sehr gut aussieht. Es scheint, dass beide Threads wie erwartet ausgeführt werden... das heißt - gleichzeitig. (Ich verwende NSLog(), um grob zu überprüfen, wann jeder Thread die Benachrichtigung sendet und empfängt).
Wenn die Ansicht eine Benachrichtigung erhält und ihre Handler-Methode aufgerufen wird, erhöhe ich einfach eine Integer-Variable und versuche, diese in die Ansicht zu zeichnen (natürlich als String). Beim Testen zeichnet der Code in drawRect: diese Ganzzahl (als Zeichenkette) auf dem Bildschirm genau richtig.
Jedoch: hier ist mein Problem (sorry es ist eine kleine Weile gedauert, um hier zu erhalten): wenn der Haupt-Thread (Ansicht) eine Benachrichtigung von der NSOperation erhält, aktualisiert es diese Test-Integer und ruft [self setNeedsDisplay]. Die Ansicht wird jedoch nicht neu gezeichnet, bis die NSOperation beendet ist! Ich hatte erwartet, dass die NSOperation als separater Thread nicht in der Lage sein würde, die Ereignisschleife des Hauptthreads zu blockieren, aber es scheint, dass genau das passiert. Wenn die NSOperation beendet ist und ihre main() zurückkehrt, zeichnet sich die Ansicht schließlich sofort neu.
Vielleicht verwende ich nicht NSOperation
richtig. Ich verwende es im "nicht-gleichzeitigen" Modus, aber trotz des Namens ist mein Verständnis, dass dies immer noch einen neuen Thread erzeugt und eine asynchrone Verarbeitung ermöglicht.
Ich bin für jede Hilfe und jeden Rat dankbar. Wenn Sie einen Code sehen möchten, lassen Sie es mich wissen.