iOS Performselektoronmainthread mit mehreren Argumenten
-
26-10-2019 - |
Frage
Ich möchte einen Selektor auf dem Haupt -Thread aus einem anderen Thread ausführen, aber der Selektor hat mehrere Argumente, ähnlich wie folgt:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
Wie kann ich das zum Arbeiten bringen? performSelectorOnMainThread: withObject: waitUntilDone:
?
BEARBEITEN
Ich möchte erklären, warum ich das brauche.
Ich arbeite mit UIImageviews am Haupt -Thread und mache die Berechnungen für sie in einem anderen Thread. Ich benutze viele Berechnungen. Wenn ich also alles auf dem Haupt -Thread mache, verzögert sich die App. Ich weiß, dass UI -Elemente nur auf dem Hauptfaden manipuliert werden können. Aus diesem Grund möchte ich, dass es auf diese Weise funktioniert, damit der Haupt -Thread Touch -Ereignisse ohne Verzögerungen anhören kann.
Lösung
Wenn Sie iOS> = 4 verwenden, würden Sie dies stattdessen tun:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething:1 b:2 c:3 d:4 e:5];
});
Das ist wie zu tun waitUntilDone:NO
. Wenn Sie warten möchten, bis die Methode fertig ist, verwenden Sie dispatch_sync
stattdessen.
Andere Tipps
Sie müssen a verwenden Nsinvocation
Erstellen Sie das Objekt, legen Sie das Ziel, den Selektor und die Argumente fest.
Dann benutze
[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
Sie können ein Objekt des NSDictionary/NSArray -Typs übergeben, der Argumente benötigt.
und akzeptieren Sie den gleichen Objekttyp in Ihrer Funktion. Dann zersetzen Sie die Werte und fahren Sie mit der Verarbeitung fort.
Sie müssen nsNumber für numerische Werte verwenden, um sie zu nsarray/nsdictionary hinzuzufügen, und später in Ihrer Funktion können Sie sie mit zurückbekommen intValue
/floatValue
etc
Best of Buck.