Utilisation de UISwitch

Bonjour à tous,
J'utilise le composant UISwitch dans mon application, en revanche lorsqu'on l'active ou le désactive, il y a un traitement qui peut prendre 2 secondes derrière, le problème est que cela bloque le mouvement de l'UISwitch, on voit qu'il s'active seulement après la fin du traitement. Comment remédier au problème ?
Merci.

Mots clés:

Réponses

  • LarmeLarme Membre

    Tu fais un traitement long sur le main thread ?
    Alors évite de faire ça, évite tout blocage du main thread en réalité.

    Plusieurs options s'offre à toi :
    Le remplacer momentanément par un spinner.
    Le mettre dans la bonne position, puis le rendre userInteractionEnabled à false le temps de faire le traitement.

  • DrakenDraken Membre

    Ce n'est jamais une bonne idée de faire un traitement long sur le processus (thread) principal. Cela bloque la mise à jour de l'interface et donne l'impression que tout est "figé".

    Si tu est vraiment forcé de le faire, n'oublie pas d'afficher l'indicateur d'activité (la roue qui tourne) pour que l'utilisateur sache qu'il se passe quelque chose.

  • heliohelio Membre
    28 oct. modifié #4

    OK merci à vous,
    cependant il y a un problème, j'ai le code suivant au niveau du changement d'état de l'UISwitch :

     @objc func stateChanged(switchState: UISwitch) {
    
        NotificationCenter.default.removeObserver("mySpecialNotificationKey")
    
        if switchState.isOn {
            print("On")
    
            let qualityOfServiceClass = DispatchQoS.QoSClass.background
            let backgroundQueue = DispatchQueue.global(qos: qualityOfServiceClass)
            backgroundQueue.async(execute: {
    
    
                print("Background...")
                self.parserProductStateChanged()
    
                NotificationCenter.default.post(name: Notification.Name(rawValue: mySpecialNotificationKey), object: self)
    
            })
    
        } else {
            print("Off")
        }
     }
    

    et ensuite dans une TableViewController le code suivant qui s'exécute car il a reçu la notification (je re parse les données car il y a eu une mise à jour mais le problème est que Xcode me dit que le reloadData ne doit pas se faire en Background, mais si je ne le fais pas ici cela bloque l'UI , c'est le serpent qui se mord la queue :

     @objc func actOnSpecialNotification() {
    
        print("I heard the notification!")
        self.Products.removeAllObjects()
        let produit = produit.init()
        _ = produit.parser()
        self.Products = produit.retourData()
        self.tableView.reloadData()
    
     }
    
  • LarmeLarme Membre
    self.Products = produit.retourData()
    self.tableView.reloadData()
    

    Doit se faire dans le main queue. La notification est postée depuis le background.

    Remplace ça par:

    DispatchQueue.main.async {
        self.Products = produit.retourData()
        self.tableView.reloadData()
    }
    
Connectez-vous ou Inscrivez-vous pour répondre.