web-dev-qa-db-fra.com

iOS performSelectorOnMainThread avec plusieurs arguments

Je voudrais effectuer un sélecteur sur le thread principal à partir d'un autre thread, mais le sélecteur a plusieurs arguments, similaires à ceci:

-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e { //... }

Comment puis-je faire fonctionner cela avec performSelectorOnMainThread: withObject: waitUntilDone:?

MODIFIER

Je voudrais expliquer pourquoi j'ai besoin de cela.

Je travaille avec UIImageViews sur le thread principal et je fais les calculs pour eux sur un autre thread. J'utilise beaucoup de calculs, donc si je fais tout sur le thread principal, l'application est en retard. Je sais que les éléments de l'interface utilisateur ne peuvent être manipulés que sur le thread principal, c'est pourquoi je voudrais que cela fonctionne de cette manière, afin que le thread principal puisse écouter les événements tactiles sans décalage.

41
McDermott

Lorsque vous utilisez iOS> = 4, vous le feriez à la place:

dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomething:1 b:2 c:3 d:4 e:5];
});

C'est comme faire waitUntilDone:NO. Si vous souhaitez attendre la fin de la méthode, utilisez dispatch_sync au lieu.

96
DarkDust

Vous devrez utiliser un NSInvocation

Créez l'objet, définissez la cible, le sélecteur et les arguments.
Ensuite, utilisez

[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
6
Macmade

vous pouvez passer un objet de type NSDictionary/NSArray ayant les arguments requis.

et acceptez le même type d'objet dans votre fonction. décomposez ensuite les valeurs et poursuivez le traitement.

vous devez utiliser NSNumber pour les valeurs numériques pour les ajouter à NSarray/NSDictionary et plus tard dans votre fonction, vous pouvez les reconvertir avec intValue/floatValue etc

meilleur de l'argent.

3
Saurabh Passolia