Envoyer un message à  la fin de la run loop courante.

Hello


 


Je voudrais savoir comment vous feriez pour reproduire le système de setNeedsDisplay/drawRect,  setNeedsLayout/layoutSubviews ou même encore autorelease/release (quoiqu'un poil différent) ?


 


En gros, éviter d'appeler plusieurs fois une méthode "lourde" (ou pas d'ailleurs) au cours d'une run loop, mais plutôt attendre la fin de celle-ci afin d'exécuter une seule fois la dite méthode.


 


Difficulté supplémentaire : si possible j'aimerais ne pas avoir à  implémenter DEUX méthodes. En gros je voudrais pouvoir envoyer plusieurs fois mon message -doSomething, mais que en interne, la méthode soit assez intelligente pour différer l'envoie du message (et de ne l'envoyer qu'une seule fois par cycle).


 


 


Alors j'ai déjà  réussi à  faire quelque chose mais c'est vraiment bricolage et j'en suis pas super fier (et je suis pas certain que ce soit hyper hyper fiable) mais je ne donne rien ici, afin de voir plutôt votre approche.


 


Merci d'avance :)


Réponses

  • CeetixCeetix Membre
    avril 2013 modifié #2

    J'avoue ne pas vraiment m'être penché sur ce point. J'ai regardé un peu la documentation de NSRunLoop et il y a une méthode qui m'intrigue :


     



    - (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modes

     


    This method sets up a timer to perform the aSelector message on the current thread's run loop at the start of the next run loop iteration.


     


    Je sais pas si ça peut t'aider mais je pense que tu as déjà  regardé ;)


     


    Après pour ne pas l'exécuter au nombre de fois que tu appelles le perform ...


  • Il y a cette méthode de NSRunloop qui peut d'intéresser:


    performSelector:target:argument:order:modes:


     


    Use this method if you want multiple messages to be sent after the current event has been processed and you want to make sure these messages are sent in a certain order.

  • Comment j'ai grillé de justesse mpergand  :P


  • AliGatorAliGator Membre, Modérateur

    Oui c'est bien cette méthode qu'il faut utiliser.


     


    Ta méthode doSomething va se contenter de mettre à  YES un flag en interne (genre une variable d'instance privée _shouldDoSomethingOnNextRunLoop) et appeler "performSelector:target:argument:order:modes:" avec un @selector(maybeDoSomethingOncePerRunloop). Il suffira ensuite de coder maybeDoSomethingOncePerRunloop :

    -(void)maybeDoSomethingOncePerRunloop {
      if (_shouldDoSomethingOnNextRunLoop) {
        _shouldDoSomethingOnNextRunLoop = NO;
        // Ton code à  exécuter
      }
    }

Connectez-vous ou Inscrivez-vous pour répondre.