Wie rufe ich PerformselectoronMainThread an: mit einem Selektor, der> 1 Argumente erfordert?

StackOverflow https://stackoverflow.com/questions/1460589

  •  12-09-2019
  •  | 
  •  

Frage

Ein typischer Aufruf an performSelectorOnMainThread: sieht aus wie das:

[target performSelectorOnMainThread:action withObject:foo waitUntilDone:NO];

Wo "Ergebnis" ein Argument ist, das an "Aktion" übergeben wurde. Eine entsprechende Aktion wäre:

- (void)doSomethingWithThing1:(id *)thing1

Was ist die richtige Syntax für das Aufrufen einer Aktion, die> 1 Argument erfordert? Wie zum Beispiel:

- (void)doSomethingWithThing1:(id *)thing1 andThing2(id *)thing2 andAlsoThing3(id *)thing3

[target performSelectorOnMainThread:action withObject:??? waitUntilDone:NO];
War es hilfreich?

Lösung

Als Reaktion auf a Ähnliche Frage beim Übergeben von Nicht-Objekten an eine Methode in performSelectorOnMainThread:, Ich habe auf Dave Dribins von Kategorie auf NSObject, wodurch Sie so etwas wie Folgendes tun können:

[[person dd_invokeOnMainThread] doSomethingWithThing1:thing1 andThing2:thing2 andAlsoThing3:thing3];

Für die Durchführung Ihrer Multi-Argument-Methode im Hauptfaden. Ich denke, das ist eine ziemlich elegante Lösung. Hinter den Kulissen wickelt er die Dinge in eine Nsinvocation ein und ruft das auf dem Hauptfaden an.

Das Bernsteinrahmen tut auch etwas Ähnliches.

Andere Tipps

Sie können dies tun, indem Sie Ihre Argumente in ein Wörterbuch oder ein Array einsetzen und dies an eine spezielle Funktion übergeben

- (void)doStuff:(NSString *)arg1 and:(NSString *)arg2 and:(NSString *)arg3 {
...
}

- (void)doStuff:(NSArray *)argArray {
    [self doStuff:[argArray objectAtIndex:0]
              and:[argArray objectAtIndex:1]
              and:[argArray objectAtIndex:2];
}

Wenn Sie die Methodensignatur des Empfängers beibehalten möchten, müssen Sie sich ansehen NSInvocation Auf diese Weise können Sie mehrere Argumentwerte angeben.

Sie könnten Ihren Anruf einwickeln und ein Wörterbuch als Container für Ihre Argumente verwenden, wie dies in einer anderen Antwort vorgeschlagen wurde, aber für mich scheint dies ein bisschen Code -Geruch zu sein.

Eine bessere Lösung entlang dieser Zeile wäre, eine Klasse zu erstellen, die die Argumentwerte zusammenfasst - dh einen stark typisierten Ansatz. Also zum Beispiel anstatt zu bestehen firstname, surname, Sie würden eine Instanz von a passieren Person Klasse. Dies ist wahrscheinlich ein besserer Weg, um zu gehen, da Methoden mit weniger Argumenten einen saubereren Code ergeben können - aber das ist ein ganz andere Geschichte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top