3

Les blocs sont géniaux. Parce que je pensais les avoir compris, je voulais les mettre en valeur et les utiliser dans une situation un peu plus complexe. Maintenant, ces blocs me donnent des coups de pied dans le visage, et j'essaie de les décomposer en morceaux compréhensibles. Dire que j'ai deux blocs dans ce pseudo code commodément nommé blockA et blockB. Le premier est un simple bloc sans paramètre et il imprime simplement une ligne. Le second prend un paramètre xyz de type id:Comment envoyer un bloc avec un paramètre sur la file d'attente ou le fil principal

void (^blockA){ NSLog(@"Doing something"); }; 
void (^blockB)(id xyz){ [xyz doSomething]; }; 

Lors de l'exécution blockA, je ferais quelque chose comme blockA(); ou quand je veux cibler la principale file d'attente/thread, j'utiliser la méthode dispatch_sync ou _async:

dispatch_sync(dispatch_get_main_queue(), blockA); 

Mais même si je sais comment distribuer blockB avec un paramètre comme blockB(someObject);, je n'arrive pas à comprendre comment appeler explicitement celui-là sur le thread principal. Je cherchais quelque chose comme la ligne suivante, mais bien sûr, qui est pas comment cela fonctionne:

dispatch_sync (dispatch_get_main_queue, BLOCKB, someObject); Maintenant, j'ai essayé d'envelopper le bloc dans un autre bloc, mais pour être honnête, cela n'a pas l'air juste et il semblait que cela causait plus de problèmes que cela a résolu. Y a-t-il autre chose que des blocs d'emballage pour distribuer un bloc avec un ou plusieurs paramètres sur la file d'attente/le thread principal?

Répondre

17

Non. Envelopper des blocs est exactement ce que vous avez à faire dans ce cas. Dans le code:

void (^block)(id someArg) = someBlock; 
id object = someObject; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    block(someObject); 
}); 

Cela peut sembler un peu étrange au début, mais ce style rend les API d'expédition de manière beaucoup plus simple et le maintien automatique des variables capturées permet. Je suis un peu surpris que vous ayez rencontré des problèmes. Qu'étaient-t-ils?

+0

Je reçois un accident de verrouillage web terrible, que je ne peux pas remonter à son origine: * Essayé pour obtenir le verrou web à partir d'un autre thread que le fil principal ou le fil web. Cela peut être le résultat d'un appel à UIKit à partir d'un thread secondaire. Crashing now ... * C'est pourquoi je suis en train de résoudre le problème, car tout code exécuté à ce moment-là aurait du tourner sur le thread principal. Je pensais que l'emboîtement des blocs pouvait avoir causé cela, mais d'après ce que vous dites, il semble que ce soit quelque chose d'autre. – epologee

+0

Quelle est la différence de simplement utiliser l'objet dans le bloc ?, et je pense que ce que vous vouliez définir est 'dispatch_async (dispatch_get_main_queue(),^{block (object);});'? – izzy

0

Je m'habitue aussi aux blocs. Honnêtement, je ne vois rien plus propre/mieux que:

dispatch_async(dispatch_get_main_queue(), ^{blockb(someObj);}); 
Questions connexes