Precisions sur le fonctionnement des blocks

shebsheb Membre
20:52 modifié dans API AppKit #1
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 :
<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 ?  ::)

Réponses

  • Philippe49Philippe49 Membre
    20:52 modifié #2
    Allez, un petit article du grand prêtre sur les Closures  ?
  • zoczoc Membre
    20:52 modifié #3
    dans 1253975054:
    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 ?
    Non, aucun thread n'est créé, c'est le thread courant qui exécute le block.

    il est placé dans une queue managée par GCD et s'exécutera probablement dans un autre thread ?

    GCD et les blocks sont deux choses très différentes (même si GCD s'appuie sur les blocks).

    Je dis des grosses bêtises ?  ::)

    Il y a sans doute une grosse confusion dans ton esprit  :)

    Philippe49 a poste un lien vers un très bon article.
  • shebsheb Membre
    20:52 modifié #4
    Merci à  tous les deux, effectivement les choses commence à  s'éclaircir  :)
  • AliGatorAliGator Membre, Modérateur
    20:52 modifié #5
    En fait faut juste se dire que [tt]enumerateObjectsUsingBlock:tonBlock(id obj, ...)[/tt] est équivalent à  faire par exemple une boucle [tt]for(id obj in imagesList) tonBlock(obj);[/tt] (bon sauf qu'en plus tu as l'index et la possibilité de stopper l'énumération en plein milieu, mais bon).

    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.
  • shebsheb Membre
    20:52 modifié #6
    Bon après avoir potassé un peu de doc je commence à  y voir plus clair.

    J'ai vu que je pouvais utiliser NSOperationQueue pour utiliser GCD (corrigez moi si je me trompe).

    Dans le thread gui je lance donc :
    <br />[monArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) {<br />		[queue addOperationWithBlock:^(void) {<br />			...<br />		}];<br />	}];<br />
    


    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 ?
  • AliGatorAliGator Membre, Modérateur
    20:52 modifié #7
    Utilise le KVO sur la clé isFinished de ta NSOperation, c'est comme ça que je fais quand j'utilise les NSOperationQueue.
    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.
Connectez-vous ou Inscrivez-vous pour répondre.