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.
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.
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 ];
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.