Передать значение для закрытия?

Я хочу сделать дополнительную логику после того, как последний элемент был обработан, но терминал показывает, что 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(...
Другие вопросы по тегам