2016-11-25 15 views
1

マップ上にプロットされた位置を、プロットされた位置の間に1秒ずつ入れようとしていますが、動作しません。ここでは、私がこれまで持っているものです。Swift 3で複数のDispatchQueue.main.asyncAfterメソッドを一度に作成

@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!) 
     } 
    } 
} 

私はそれを設定している途中、forループ内の各項目はDispatchQueue.main.asyncAfterに呼び出されるメソッドを持っていますが、各項目は、1秒後に発送されます。最初は0秒後、1秒後、2などとなります。

プロット関数の引数が保存されているようには見えませんが、プロット関数が初めて呼び出されたときの日とサイトの値は9です0はループが終了したときの値です。

+1

[パス値閉鎖するには?](http://stackoverflow.com/questions/31565832/pass-value-to-closure) –

答えて

2

あなたはローカル変数を作成することによってこの問題を解決することができます

@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 
    } 
} 

あるいは、Pass value to closure?にマーティンRで指摘したように、あなたはこれらの変数を「取り込む」ことができます。

@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 
    } 
} 

か、個人的には、おそらくforループを使用してこれを少しきちんと整理してください:

@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

あなたの助けてくれてありがとうRob! –

関連する問題