在 Swift 3 中一次创建多个 DispatchQueue.main.asyncAfter 方法
Create several DispatchQueue.main.asyncAfter methods at once in Swift 3
我正在尝试在地图上绘制位置,一个接一个,每个绘制位置之间间隔 1 秒,但效果不佳。这是我目前所拥有的:
@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秒,等等
然而,似乎没有保存 plot 函数参数,因为第一次调用 plot 函数时,day 和 site 值是 9 和 0,这是它们在循环完成时的值。
您可以通过创建局部变量来解决这个问题:
@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
}
}
或者,正如 Martin R 在 中指出的那样,您可以 "capture" 这些变量:
@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
}
}
}
我正在尝试在地图上绘制位置,一个接一个,每个绘制位置之间间隔 1 秒,但效果不佳。这是我目前所拥有的:
@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秒,等等
然而,似乎没有保存 plot 函数参数,因为第一次调用 plot 函数时,day 和 site 值是 9 和 0,这是它们在循环完成时的值。
您可以通过创建局部变量来解决这个问题:
@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
}
}
或者,正如 Martin 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
}
}
}