Rafraîchir zone de texte pendant l'execution d'un code long

Bonjour à tous,

je cherche a créer un log qui permet à l'utilisateur d'être informé du déroulement du programme en tache de fond. Pour cela j'utilise une zone de texte dans laquelle j'affiche des messages au fur et à mesure. Le problème est que cette zone de texte ne se rafraichit qu'a la fin de l'execution du programme et pas pendant. Comment faire pour que cela se réalise pendant l'execution du code? J'ai essayé avec dispatchqueue mais sans succès. Je vous livre ici quelques lignes de mon programme avec la fonction qui ne marche pas...
je precise que le langage est du Swift écrit avec Xcode 8.

@IBAction func btnSave(_ sender: Any) {
    DispatchQueue.global(qos: .background).async {
        profondeur = Int((self.niveauRecherche.selectedItem?.title)!)!
        //recupere l'URL saisie
        let myURLString : String = self.textUrl.stringValue
        let url = URL(string:self.textUrl.stringValue)
        DispatchQueue.main.async {
            self.txtLog.stringValue="Veryfing first URL"   // c'est cela qui ne fonctionne pas
        }
        //verifie la validite de l'URL de départ
        if self.checkURL(urlString: myURLString){
        etc...
        etc...
       }

Existe-t-il un moyen simple de faire cela???

Merci d'avance pour votre aide

Jordy

Mots clés:

Réponses

  • Bonjour,

    Rajoute un "log" après le "DispatchQueue.main.async {" pour voir si tu rentres bien dans cette boucle, ce qui devrait être le cas.
    Il manque peut-être dans cette boucle une instruction pour rafraîchir l'affichage ?

    Cordialement
    Nicolas

  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2018 modifié #3

    Ne fais jamais ce genre de truc:

    profondeur = Int((self.niveauRecherche.selectedItem?.title)!)!
    

    Tu commences avec le selectedItem, qui pourrait être nil

    Même s'il est nil, tu essaies d'accèder title

    Même s'il n'y a pas de title, tu silences le compilateur en mettant un '!'

    Ne sachant pas si la force a réussi, tu continues de construire un Int de ce qui devrait être un String, mais peut-être nil, mais peut-être un String qui n'est pas valide pour faire un Int.

    Et, si l'utilisateur saisissait "1O" (une O) à la place de "10", qu'est-ce qui se passera ?

    ça plante !!!

    Non, tu devrais vérifier à chaque étape si les manipulations pourraient échouer.

        var profondeur: Int = 0
    
        if let selectedItem = self.niveauRecherche.selectedItem,
           let intFromTitle = Int(selectedItem.title)
        {
          profondeur = intFromTitle
        }
    

    Ou, encore mieux, vérifier le texte lors de sa saisie.

    Ou, si niveauRecherche était peuplé d'une liste de Int, récupères la valeur de là, à la place de faire tout cette conversion.

  • Bonjour Joanna,
    niveauRecherche est un NSPopUpButton qui déroule une liste qui contient des valeurs de 1 à 5 sans aucun blanc et sans la possibilité d'y entrer une autre valeur. Le test n'a donc aucun intérêt car une valeur est toujours présente par défaut.
    Mais mon sujet n'est pas celui-ci. Sais-tu pourquoi le code DispatchQueue.main.async ne s'execute pas?
    merci d'avance.

  • Joanna CarterJoanna Carter Membre, Modérateur

    @jordy a dit :
    Bonjour Joanna,
    niveauRecherche est un NSPopUpButton qui déroule une liste qui contient des valeurs de 1 à 5 sans aucun blanc et sans la possibilité d'y entrer une autre valeur. Le test n'a donc aucun intérêt car une valeur est toujours présente par défaut.

    Dans ce cas là, tu ne devrais jamais stocker les valeurs seulement dans un composant visuel. Il faut le charger d'un modèle qui contient les valeurs.

    Puis, tu peux récupérer les valeurs directe de là sans besoin de convertir des Strings

    Mais mon sujet n'est pas celui-ci. Sais-tu pourquoi le code DispatchQueue.main.async ne s'execute pas?
    merci d'avance.

    Tu as mis un breakpoint sur la ligne:

     self.txtLog.stringValue="Veryfing first URL" 
    

    … pour vérifier si l'exécution arrive là ?

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