Le problème est que performSelectorInBackground:withObject: prend un seul argument d'objet. Un moyen de contourner cette limitation est de passer d'un dictionnaire (ou un tableau) des arguments à un "wrapper" qui déconstruit les arguments et les appels de votre méthode:
De cette façon, vous êtes seulement de passage d'un "seul" argument de la semi-finition appel, mais cette méthode peut construire plusieurs arguments dont vous avez besoin pour l'appel réel (qui aura lieu sur le même backgrounded thread).
À l'aide de la NSInvocation classe et la variable d'arguments on pourrait écrire un très élégant classe wrapper générique.. Peut-être que la prochaine fois que j'ai besoin d'écrire juste un autre wrapper je vais faire un essai! vous m'a inspiré pour écrire une telle chose, découvrez ma réponse. Ces jours, vous devriez vraiment utiliser dispatch_async(...) à faire quelque chose comme ça, plutôt que d'-performSelectorInBackground:... D'accord. Mars 2011, a été un autre temps...
Je viens de trouver cette question et n'étais pas heureux avec les réponses. À mon avis, ni de faire bon usage des outils disponibles, et de passage autour de l'arbitraire de l'information dans les tableaux et les dictionnaires en général je m'en inquiète.
Donc, je suis allé et a écrit un petit NSObject catégorie qui invoque l'arbitraire d'un sélecteur avec un nombre variable d'arguments:
Cela provoquera une fuite à un NSArray. Vous devez utiliser [NSArray arrayWithObjects:...] au lieu de [[NSArray alloc] initWithObjects:...]. Grâce respectTheCode, je suis paresseux j'ai donc toujours utiliser autorelease. Merci, de toute façon. Cela ne semble pas fonctionner à moins que le sélecteur de je suis spectacle s'attend à un tableau. Sinon, il les choses le premier paramètre dans le sélecteur doit être la matrice. Vous n'avez pas de corriger les alloc problème signalé par @respectTheCode et il faut aussi penser aux arguments de la fonction doit être un NSArray si votre performSelector exemple ont été à travailler comme l'a souligné la Volonté. Merci pour vos commentaires. Les problèmes signalés ont été corrigés.
avec performSelectorInBackground vous ne pouvez passer qu'un argument, alors en faire un objet personnalisé à cette méthode pour stocker vos données, itll être plus concis que l'ambiguïté d'un dictionnaire ou d'un tableau. L'avantage de ceci est que vous pouvez passer le même objet autour de quand fait contenant plusieurs retour des propriétés.
Le problème est que
performSelectorInBackground:withObject:
prend un seul argument d'objet. Un moyen de contourner cette limitation est de passer d'un dictionnaire (ou un tableau) des arguments à un "wrapper" qui déconstruit les arguments et les appels de votre méthode:De cette façon, vous êtes seulement de passage d'un "seul" argument de la semi-finition appel, mais cette méthode peut construire plusieurs arguments dont vous avez besoin pour l'appel réel (qui aura lieu sur le même backgrounded thread).
vous m'a inspiré pour écrire une telle chose, découvrez ma réponse.
Ces jours, vous devriez vraiment utiliser dispatch_async(...) à faire quelque chose comme ça, plutôt que d'-performSelectorInBackground:...
D'accord. Mars 2011, a été un autre temps...
OriginalL'auteur
Je viens de trouver cette question et n'étais pas heureux avec les réponses. À mon avis, ni de faire bon usage des outils disponibles, et de passage autour de l'arbitraire de l'information dans les tableaux et les dictionnaires en général je m'en inquiète.
Donc, je suis allé et a écrit un petit
NSObject
catégorie qui invoque l'arbitraire d'un sélecteur avec un nombre variable d'arguments:En-Tête De Catégorie
Catégorie De La Mise En Œuvre
Utilisation
OriginalL'auteur
Bien, j'ai utilisé ceci:
pour cela:
NSArray
. Vous devez utiliser[NSArray arrayWithObjects:...]
au lieu de[[NSArray alloc] initWithObjects:...]
.Grâce respectTheCode, je suis paresseux j'ai donc toujours utiliser autorelease. Merci, de toute façon.
Cela ne semble pas fonctionner à moins que le sélecteur de je suis spectacle s'attend à un tableau. Sinon, il les choses le premier paramètre dans le sélecteur doit être la matrice.
Vous n'avez pas de corriger les alloc problème signalé par @respectTheCode et il faut aussi penser aux arguments de la fonction doit être un NSArray si votre performSelector exemple ont été à travailler comme l'a souligné la Volonté.
Merci pour vos commentaires. Les problèmes signalés ont été corrigés.
OriginalL'auteur
avec performSelectorInBackground vous ne pouvez passer qu'un argument, alors en faire un objet personnalisé à cette méthode pour stocker vos données, itll être plus concis que l'ambiguïté d'un dictionnaire ou d'un tableau. L'avantage de ceci est que vous pouvez passer le même objet autour de quand fait contenant plusieurs retour des propriétés.
et à transmettre cet objet à votre méthode:
assurez-vous de nettoyer l'objet, lors de la fait pour empêcher les fuites de mémoire
OriginalL'auteur