我想在处理i完最后一个项目之后做额外的逻辑,但是终端显示的值始终与之相同c.知道如何传递循环变量吗?
let c = a.count
for var i=0; i<c; i++ {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
// ..
dispatch_async(dispatch_get_main_queue(), {
println("i \(i) c \(c)")
if i == c-1 {
// extra stuff would come here
}
})
})
}
Run Code Online (Sandbox Code Playgroud)
执行闭包时,for循环已经完成并且i= c.在for循环中需要一个辅助变量:
let c = a.count
for var i=0; i<c; i++ {
let k = i
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
// ..
dispatch_async(dispatch_get_main_queue(), {
println("k \(k) c \(c)")
if k == c-1 {
// extra stuff would come here
}
})
})
}
Run Code Online (Sandbox Code Playgroud)
您可以i使用
闭包中的捕获列表 显式捕获值[i],然后您无需将其复制到单独的变量中.例:
let c = 5
for var i=0; i<c; i++ {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
[i] in // <===== Capture list
dispatch_async(dispatch_get_main_queue(), {
println("i \(i) c \(c)")
})
})
}
Run Code Online (Sandbox Code Playgroud)
输出:
i 0 c 5 i 1 c 5 i 2 c 5 i 3 c 5 i 4 c 5