Utilisation Timer

Bonjour,

J’essaie de créer un super simon mais j’ai quelques problèmes pour que la fonction aléatoire joue une musique avec le changement de couleur du bouton ( 3 boutons au total ). La boucle n’attend pas la fin du timer pour lancer l’action suivante

Merci de votre aide - Lionel

func switchColor( Case : UIButton,  NumButton : Int)
 {
        switch NumButton {

        case 1 :
         Case.backgroundColor = UIColor.yellow
        AVplayer(nom: "do")
        Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer : Timer) in
        Case.backgroundColor = UIColor.blue } )
           
        case 2 :
            Case.backgroundColor = UIColor.yellow
            AVplayer(nom: "re")
            Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer : Timer) in
            Case.backgroundColor = UIColor.red } )
            
        case 3 :
            Case.backgroundColor = UIColor.yellow
          AVplayer(nom: "mi")
            Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (timer : Timer) in
            Case.backgroundColor = UIColor.green } )
            
        default : break
        }
    }
@IBAction func ui_debut_jeu() {
         var i : Int = 0
       repeat {
        aleatoire()   // appel de la fonction aléatoire pour rajouter une note supplémentaire dans la liste 
            nombredeligne = nombre.count
            for i in 1...nombredeligne {
                let boutoncalcul = nombre[i-1]
               playcolor(NumButton: boutoncalcul)
               testbutton()
            }
        }
            while reponse == true
               print("Erreur")

Salut Lionel,

c’est normal car les Timer sont asynchrones : une fois programmés, le reste de la fonction s’exécute et leur code sera exécuté plus tard, de façon asynchrone.
Si tu veux attendre que le Timer ait terminé avant de continuer, une façon de faire serait de demander au code du timer de lancer la prochaine action.
Pour l’instant ton timer ne fait que changer la couleur, il faudrait qu’il lance aussi le prochain timer. Tu n’aurais donc plus de boucle, tu lancerais uniquement le premier timer, et chaque timer sera en charge de faire son action puis de programmer le suivant.

Une autre possibilité serait de ne lancer qu’un timer qui répète la même fonction toutes les 0.5 secondes, et dans cette fonction tu décides à chaque tour de l’action à faire. Par exemple tu prépares un tableau qui contient, dans l’ordre, l’ensemble des changements à faire, puis tu lances ton timer. Chaque passage dans la fonction pioche dans le tableau pour effectuer le prochain changement puis le retire du tableau. Quand le tableau est vide tu peux arrêter ton timer.

Super, merci de la réponse plus que rapide

1 « J'aime »