2013-05-10 5 views
5

Ich habe einen Datenladevorgang, der vom Hauptthread ausgeführt werden muss, um potenzielle Blockierungsprobleme zu vermeiden. Um dies zu tun, verwende ich eine NSOperationQueue und NSOperations.Wie Sie eine NSOperation blockieren, bis eine NSOperationQueue beendet ist?

Ein Problem, das aufgetreten ist, besteht jedoch darin, dass eine der Operationen vorhanden ist, um zusätzliche Operationen basierend auf eingehenden Informationen zu generieren. Der Versuch, dieses Problem zu lösen, löste auch einige kleinere Probleme, die ich anderswo hatte, da die Lösung, die ich traf, darin bestand, der NSOperation eine eigene Warteschlange für Teilaufgaben zu geben.

Das Problem ist, dass, sobald 'main' beendet wird, die NSOperation als 'fertig' markiert wird, unabhängig davon, ob die Unterwarteschlange fertig bearbeitet ist oder nicht; Wie überschreibe ich dieses Verhalten?

+0

Klingt, als ob Sie nach einer [gleichzeitigen 'NSOperation'] (http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html) suchen? –

+0

@CarlVeazey Nicht ... genau, aber es sieht so aus, als ob die Schritte, die verwendet werden, um eine gleichzeitige NSOperation zu erstellen, dasselbe tun, nach dem ich eigentlich suche. Sie müssen überschreiben, wie die Startmethode isFinished/isExecuting behandelt, und ich denke, genau das muss ich hier tun. Ich muss den Start überschreiben, damit es nicht gesetzt wird. Was bedeutet, die KVO-Sachen zu handhaben, wenn ich diese Eigenschaften ändere, oh Freude. – RonLugge

+0

@CodaFi Ich bin mir nicht sicher, ob ich mich klar ausgedrückt habe, aber die Antwort, die du vorgeschlagen hast, scheint keinen Sinn zu ergeben. Abhängigkeiten verhindern, dass eine Operation ausgeführt wird, sie verhindern jedoch nicht, dass sie beendet wird, sobald sie mit der Ausführung begonnen hat. Zumindest scheinen das die Referenzen zu sagen. – RonLugge

Antwort

1

Sie könnten eine waitUntilAllOperationsAreFinished Nachricht an Ihre untergeordnete Warteschlange senden, bevor Sie Ihre Hauptarbeitsmethode beenden. Das ist einfach, aber keine gute Idee, da es einen ganzen Thread blockiert, der ziemlich verschwenderisch ist.

Eine bessere Lösung wäre die Verwendung des Abhängigkeitssystems. Erstellen Sie eine andere Operation, die von Ihrer Hauptoperation abhängig ist. Nachdem Sie Ihre untergeordneten Operationen erstellt haben, fügen Sie sie auch als eine Abhängigkeit zu dieser neuen Operation "finishing" hinzu.

1

sobald ‚main‘ Exits, die NSOperation als ‚fertig‘ zu kennzeichnen wird,

Diese Logik in [NSOperation start] implementiert ist, so dass Sie nur mit Ihrer eigenen Logik außer Kraft setzen müssen, um es : Aufruf main, die einige zusätzliche Operationen hervorbringt, die nach Abschluss den Status isFinished auf den Vorgang festlegen.

Verwandte Themen