2016-11-25 204 views
1

一次創建幾個DispatchQueue.main.asyncAfter方法,我想有位置的地圖,一個上繪製相繼與各間在1秒內繪製的位置,但它並不完全工作。這是我到目前爲止有:斯威夫特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!) 
     } 
    } 
} 

的方式我有它設置,在for循環將會有一個名爲在DispatchQueue.main.asyncAfter方法,但每個項目將被派往每次一秒鐘後項。首先爲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

感謝您的幫助羅! –