Передать значение для закрытия?
Я хочу сделать дополнительную логику после того, как последний элемент был обработан, но терминал показывает, что 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
}
})
})
}
3 ответа
Решение
Вы можете захватить значение 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)")
})
})
}
Выход:
i 0 c 5 i 1 c 5 i 2 c 5 i 3 c 5 i 4 c 5
К тому времени, когда ваше закрытие выполнено, цикл 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
}
})
})
}
Вам нужно объявить переменную (не переменную итерации), чтобы получить правильную область видимости, например
for var _i=0; _i<c; _i++ {
let i = _i
dispatch_async(...