IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Affichage d'un UIImage loading lors d'un traitement


Sujet :

Objective-C

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut Affichage d'un UIImage loading lors d'un traitement
    Bonjour
    dans une fonction qui récupère un contenu d'un feed j'ai besoin de mettre une image (loading) le temps que je recharge mon tableView.

    je suis parvenu à afficher le l'image et la cacher avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [imageLoading setHidden:FALSE];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [imageLoading setHidden:TRUE];
    mais le problème c'est que la fonction n'affiche rien jusqu'a la fin du traitemant.
    c'est à dire qu'elle n'affiche le gif et ne le cache qu'a la fin de la fonction

    Est ce que vous pourriez m'aider sur ce coup

    Merci d'avance les amis

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    Bonjour
    dans une fonction qui récupère un contenu d'un feed j'ai besoin de mettre une image (loading) le temps que je recharge mon tableView.

    je suis parvenu à afficher le l'image et la cacher avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [imageLoading setHidden:FALSE];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [imageLoading setHidden:TRUE];
    mais le problème c'est que la fonction n'affiche rien jusqu'a la fin du traitemant.
    c'est à dire qu'elle n'affiche le gif et ne le cache qu'a la fin de la fonction

    Est ce que vous pourriez m'aider sur ce coup

    Merci d'avance les amis
    Le rafraichissement des éléments visuels se fait toujours de manière asynchrone :

    le "setHidden:NO" va provoquer un "setNeedsDisplay:YES" qui marquera la vue comme devant être rafraîchie lors du prochain passage dans la "runloop",
    en conséquence si votre code de chargement se déroule de manière synchrone, la "runloop" n'est de nouveau traversée qu'à la fin du traitement… d'où le phénomène observé.

    Solutions:
    1. exécuter le code de chargement de manière asynchrone pour permettre à la "runloop" d'appeler le "drawInRect:" des vues à rafraîchir (ce qui permet par exemple aussi par effet de bord de voir la table view se remplir au fur et à mesure…)
    mais nécessite plus d'attention sur l'activation/désactivation des contrôles qui ne peuvent plus être manipulés par l'utilisateur durant le chargement
    2. moins propre : appeler explicitement "drawInRect:" de UIImage mais sans garantie que cela fonctionne dans tous les cas
    3. appeler vous même les méthodes de NSRunloop dans votre code de chargement

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    J'ai trouvé le code suivant sur un site et je l'ai utilisé dans ma fonction, mais je l'ai pas trop compri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    maFonction
    {	
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    	
    [loading setHidden:FALSE];//Aficher l'image loading
    
    [runLoop run];
    [pool release];
    
    //Traitement (Récupération des données d'un feed)
    
    
    [loading setHidden:TRUE];//cacher l'image loading
    }
    Fin Mafonction


    est ce que cette ligne sert a quelquechose?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    pour le runloop ça me permet d'afficher l'image à temps mais le problème c'est que le code après le [runLoop run];
    ne s'exécute pas.

    je suis sure que j'ai fait un grand n'importe quoi
    est ce que vous pouvez me confirmer çà?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    J'ai trouvé le code suivant sur un site et je l'ai utilisé dans ma fonction, mais je l'ai pas trop compri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    maFonction
    {	
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    	
    [loading setHidden:FALSE];//Aficher l'image loading
    
    [runLoop run];
    [pool release];
    
    //Traitement (Récupération des données d'un feed)
    
    
    [loading setHidden:TRUE];//cacher l'image loading
    }
    Fin Mafonction


    est ce que cette ligne sert a quelquechose?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    pour le runloop ça me permet d'afficher l'image à temps mais le problème c'est que le code après le [runLoop run];
    ne s'exécute pas.

    je suis sure que j'ai fait un grand n'importe quoi
    est ce que vous pouvez me confirmer çà?
    Oui,
    "[runLoop run]" démarre une nouvelle run loop complète qui ne s'arrêtera "jamais"…
    (faut pas copier du code de n'importe où…)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];
    exécutera la RunLoop une seule fois ce qui doit suffire à rafraîchir la vue.

    et l'allocation du NSAutoreleasePool ne sert strictement à rien dans le contexte qui vous occupe.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    Merci c'est Résolu

    çà marche aussi avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
    mais votre ligne est compacte c'est mieux
    Merci encore une fois pour ta précieuse aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/11/2009, 17h08
  2. comment empêcher l'affichage de l'adresse ip lors d'un ping ?
    Par vacknov dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 25/09/2007, 18h03
  3. [PHP-JS] loading lors d'un envoi
    Par gforce dans le forum Langage
    Réponses: 13
    Dernier message: 16/04/2007, 13h07
  4. [WinForms]probleme affichage lors d'un traitement
    Par Rankyboy dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 15/06/2006, 14h13
  5. Affichage valeur de la variable lors du debug
    Par thanae dans le forum Access
    Réponses: 1
    Dernier message: 03/12/2005, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo