2016-11-25 1 views
1

J'essaie d'avoir des emplacements tracés sur une carte, l'un après l'autre avec 1 seconde entre chaque emplacement tracé, mais cela ne fonctionne pas tout à fait. Voici ce que j'ai jusqu'à présent:Créer plusieurs méthodes DispatchQueue.main.asyncAfter à la fois dans Swift 3

@IBAction func playButtonPressed(_ sender: Any) { 
    var index = 0.0 
    var i = 0 
    var j = 0 
    while i < sites.count { 
     while j < sites[i].count { 
      DispatchQueue.main.asyncAfter(deadline: .now() + 1.0*index) { 
       self.plot(day:i,site:j) 
      } 
      j += 1 
      index += 1 
     } 
     j = 0 
     i += 1 
    } 
} 

func plot(day:Int,site:Int) { 
    for letter in glossary { 
     let siteToPlot = sites[day][site] 
     if let location = letter[siteToPlot] { 
      setUpMap(name: location.name!, lat: location.lat!, long: location.long!) 
     } 
    } 
} 

La façon dont je l'ai mis en place, chaque élément de la boucle aura une méthode appelée dans le DispatchQueue.main.asyncAfter, mais chaque article sera expédié une seconde plus tard . La première sera 0 seconde plus tard, puis 1, puis 2, etc.

Il ne semble pas que les arguments de la fonction plot soient sauvegardés. Cependant, lorsque la fonction plot est appelée pour la première fois, les valeurs du jour et du site sont 9 et 0, qui sont leurs valeurs lorsque la boucle est terminée.

+1

Copie possible de [Valeur de passe à la fermeture?] (http://stackoverflow.com/questions/31565832/pass-value-to-closure) –

Répondre

2

Vous pouvez résoudre ce problème en créant des variables locales:

@IBAction func playButtonPressed(_ sender: Any) { 
    var index = 0.0 
    var i = 0 
    var j = 0 
    while i < sites.count { 
     while j < sites[i].count { 
      let day = i 
      let site = j 
      DispatchQueue.main.asyncAfter(deadline: .now() + 1.0 * index) { 
       self.plot(day: day, site: site) 
      } 
      j += 1 
      index += 1 
     } 
     j = 0 
     i += 1 
    } 
} 

Ou, comme l'a fait par Martin R dans Pass value to closure?, vous pouvez "capturer" ces variables:

@IBAction func playButtonPressed(_ sender: Any) { 
    var index = 0.0 
    var i = 0 
    var j = 0 
    while i < sites.count { 
     while j < sites[i].count { 
      DispatchQueue.main.asyncAfter(deadline: .now() + 1.0 * index) { [i, j] in 
       self.plot(day: i, site: j) 
      } 
      j += 1 
      index += 1 
     } 
     j = 0 
     i += 1 
    } 
} 

Ou, personnellement, J'utiliserais probablement les boucles for pour nettoyer un peu:

@IBAction func playButtonPressed(_ sender: Any) { 
    var delay = 0.0 
    for i in 0 ..< sites.count { 
     for j in 0 ..< sites[i].count { 
      DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [i, j] in 
       self.plot(day: i, site: j) 
      } 
      delay += 1 
     } 
    } 
} 
+0

Merci pour votre aide Rob! –