Precisions sur le fonctionnement des blocks
sheb
Membre
Bonjour à tous,
Ayant acquis 10.6 récemment, je suis en train de parcourir toutes les nouvelles API.
La chose qui m'excitait le plus était les blocks, mais j'ai peur d'etre passé à coté de quelque chose ..
Soit le morceau de code suivant :
que se passe-t-il concrètement quand le enumerateObjects s'exécute ? création d'un ou plusieurs thread pour le parcours du tableau ?
En fait je me rends compte en écrivant ce message que je n'ai pas compris grand chose aux blocks ... :-\\
Un block s'execute toujours dans le thread courant ? il est placé dans une queue managée par GCD et s'exécutera probablement dans un autre thread ? Je dis des grosses bêtises ? ::)
Ayant acquis 10.6 récemment, je suis en train de parcourir toutes les nouvelles API.
La chose qui m'excitait le plus était les blocks, mais j'ai peur d'etre passé à coté de quelque chose ..
Soit le morceau de code suivant :
<br />NSArray *imagesList;<br />....<br />[imagesList enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { <br /> ...<br /> }];<br />
que se passe-t-il concrètement quand le enumerateObjects s'exécute ? création d'un ou plusieurs thread pour le parcours du tableau ?
En fait je me rends compte en écrivant ce message que je n'ai pas compris grand chose aux blocks ... :-\\
Un block s'execute toujours dans le thread courant ? il est placé dans une queue managée par GCD et s'exécutera probablement dans un autre thread ? Je dis des grosses bêtises ? ::)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
GCD et les blocks sont deux choses très différentes (même si GCD s'appuie sur les blocks).
Il y a sans doute une grosse confusion dans ton esprit
Philippe49 a poste un lien vers un très bon article.
Autrement dit c'est juste une boucle, exécutée donc dans le même thread.
Après oui GCD se base sur les blocks, il permet de demander en gros des trucs comme "tiens, exécute moi ce block de code quand t'auras le temps (et tu te démerdes avec tes histoires de threads et de queue etc. en interne je veux pas le savoir)"... Mais bon, si d'un côté pour utiliser GCD tu passes en général des blocks pour indiquer justement les blocs de code à exécuter, d'un autre côté tu peux tout à fait utiliser les blocks sans utiliser GCD, dans un tout autre contexte.
Et c'est le cas avec des méthodes comme enumerateObjectsUsingBlock.
J'ai vu que je pouvais utiliser NSOperationQueue pour utiliser GCD (corrigez moi si je me trompe).
Dans le thread gui je lance donc :
Cependant, je voudrais être au courant lorsque la queue a terminée toutes les opérations, mais je n'ai pas vu de notification y correspondant.
J'ai bien vu un - (void)waitUntilAllOperationsAreFinished mais comme je pouvais m'en douter, ca bloque le thread gui (et donc l'interface graphique est gelée).
J'ai bien une solution, lancer le enumerateObjectsUsingBlock dans un autre thread, et attendre dans le thread gui une notification NSThreadWillExitNotification, mais bon je trouve ca un peu crade ...
Vous voyez une meilleure solution ?
Bon maintenant là tu ajoutes une opération que tu ne crées pas toi même sous forme de NSOperation* mais avec un block directement passé en paramètre d'une méthode de NSOperationQueue... mais bon y'a certainement moyen de faire qd mm.