Compiler warnt bei performSelectorOnMainThread: @selector (delegateMethod)

8

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.

    
RickiG 21.12.2010, 12:41
quelle

4 Antworten

17
Die Methode

performSelectorOnMainThread:withObject:waitUntilDone: wird in der Klasse NSObject deklariert. Wenn Ihr Delegate-Objekt von NSObject erbt, können Sie es als

deklarieren %Vor%

Der Compiler wird also wissen, dass der Delegat auf die Methoden von NSObject reagiert und keine Warnung ausgibt.

    
Vladimir 21.12.2010, 12:57
quelle
3

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

    
Maarten 06.09.2011 11:59
quelle
2

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.

    
Henrik P. Hessel 21.12.2010 12:55
quelle
2

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).

    
deanWombourne 21.12.2010 12:58
quelle

Tags und Links