Ich habe eine Klasse. Innerhalb dieser Klasse gebe ich eine NSOperation in die NSOperationQueue, die in meinen globalen Variablen lebt.
Jetzt ist meine NSOperation beendet. Ich möchte nur wissen, dass es in meiner Klasse fertig ist und dass die Operation Daten an diese Klasse weitergibt. Wie wird das normalerweise gemacht?
Ich benutze das Delegiertenmuster - das war der Ansatz, den mir die Jungs auf einer Apple Developer Conference empfohlen haben.
Das Gerüst:
MyOperationDelegate
mit einer setResult:(MyResultObject *) result
-Methode ein. @property id<MyOperationDelegate> delegate;
zur von Ihnen erstellten NSOperation-Unterklasse hinzu. Die Arbeit:
[myOperation setDelegate: self];
[delegate setResult: myResultObject];
auf, um das Ergebnis weiterzugeben. Fügen Sie Ihrer Klasse einen Beobachter hinzu, der nach Änderungen am isFinished-Wert der NSOperation-Unterklasse
lauscht %Vor%Implementieren Sie dann die folgende Methode, indem Sie nach dem Kontext suchen, den Sie als Listener registriert haben. Sie können die Daten, die Sie aus der NSOperation-Unterklasse abrufen möchten, über eine Zugriffsmethode / -eigenschaft bereitstellen.
%Vor%Überprüfen Sie die KVO-Programmierung Guide und die Concurrency Programming Guide für weitere Informationen.
Beachten Sie außerdem, dass der Beobachter im selben Thread wie die Operation empfangen wird. Daher müssen Sie möglicherweise Code im Hauptthread ausführen, wenn Sie mit der Benutzeroberfläche arbeiten möchten.
Eine weitere Alternative ... Wenn Sie nach Abschluss der Operation etwas arbeiten müssen, können Sie diese Arbeit in einem Block zusammenfassen und eine Abhängigkeit verwenden. Dies ist besonders bei NSBlockOperation sehr einfach.
%Vor% Sie können auch setCompletionBlock
Tags und Links objective-c iphone cocoa cocoa-touch