Ich habe eine NSOperation, die einige Web-Service-Funktionen umschließt. Die NSOperation hat einen Delegaten, der benachrichtigt werden soll, wenn die Operation beendet ist.
Da die NSOperation in einem anderen Thread lebt, muss ich den Aufruf wie folgt machen:
%Vor%Es funktioniert gut, aber es gibt mir eine Warnung:
Warnung: '-performSelectorOnMainThread: withObject: waitUntilDone:' nicht in Protokoll (en) gefunden
Ich stimme dem Compiler vollständig zu, er sieht einen Delegaten, er überprüft das Protokoll, er findet keine Deklaration einer performSelector-Methode.
Meine Frage ist: Kann ich die Warnung entfernen, indem ich diesen Aufruf auf eine andere Art und Weise mache?
Meine zwei Vermutungen sind, dass ich (1) eine Methode namens
schreiben könnte %Vor%und rufe das per performSelectorOnMainThread auf, aber ich finde, dass diese Lösung umständlich und ein extra, schwer zu lesender Schritt über der Delegierung ist.
Die zweite Lösung könnte darin bestehen, den Delegaten auf den Typ meines übergeordneten Objekts innerhalb des Selektors zu transformieren, aber das ist einfach verrückt und geht gegen das Muster der Delegiertenverkapselung.
Ich würde wirklich eine dritte Lösung von jemandem mit einem besseren Verständnis der Sprache zu schätzen wissen:)
Vielen Dank im Voraus.
EDIT: Delegierte Deklaration hinzugefügt:
%Vor%Ich erkläre meinen Delegierten als ID. Der Delegate selbst erweitert UIViewController.
Ich konnte sehen, dass NSObject funktioniert.
performSelectorOnMainThread:withObject:waitUntilDone:
wird in der Klasse NSObject
deklariert. Wenn Ihr Delegate-Objekt von NSObject erbt, können Sie es als
Der Compiler wird also wissen, dass der Delegat auf die Methoden von NSObject reagiert und keine Warnung ausgibt.
Es könnte sogar eine bessere Lösung sein, performSelectorOnMainThread nicht aufzurufen: auf einem Delegaten oder einer anderen Protokollimplementierung. Übernehmen Sie die Verantwortung des Delegierten / Empfängers, um festzustellen, ob es Dinge im Hauptthread tun muss.
%Vor%Implementierung delegieren
%Vor%Es sieht vielleicht nach mehr Code aus, aber die Verantwortung ist jetzt am richtigen Ort
Eigentlich verwende ich auf iOS 4 NSNotifications und Observer (mit Blocks), um Updates auf dem Mainthread durchzuführen.
%Vor%Ich habe mein Design hier aufgeschrieben.
1) Deklarieren Sie das Protokoll Ihres Stellvertreters, um das NSObject-Protokoll in der .h-Datei zu erweitern
%Vor%2) Konvertieren Sie nach NSObject in Ihrem Aufruf
%Vor%Ich empfehle definitiv Nummer (1).
Tags und Links objective-c iphone