2015-07-22 14 views
5

Voglio eseguire una logica aggiuntiva dopo l'elaborazione dell'ultimo elemento, ma il terminale mostra che i ha sempre lo stesso valore di c. Qualche idea su come passare la variabile del ciclo in?Passare il valore alla chiusura?

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 
      } 
     }) 
    }) 
} 
+0

Chiusure catturare variabili fro loro ambito esterno, quindi questo codice dovrebbe andare bene. Si prega di fornire dove si inizializza 'c'. –

+0

Questo è destinato a raggiungere un limite di threading se il valore di 'c' è troppo alto ... –

risposta

6

È possibile catturare il valore di i esplicitamente con una lista cattura[i] nella chiusura, allora non c'è bisogno di copiarlo in una variabile separata . Esempio:

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)") 
     }) 
    }) 
} 

uscita:

 
i 0 c 5 
i 1 c 5 
i 2 c 5 
i 3 c 5 
i 4 c 5 
2

È necessario dichiarare una variabile (non la variabile di iterazione) per ottenere l'ambito corretto, ad es.

for var _i=0; _i<c; _i++ { 
    let i = _i 
    dispatch_async(... 
6

Con il tempo viene eseguito il vostro chiusura, il ciclo ha già finito e i = c. Hai bisogno di una variabile ausiliaria all'interno del ciclo 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 
      } 
     }) 
    }) 
} 
Problemi correlati