2016-02-02 1 views
2

Итак, я выполняю async-запрос, который возвращает несколько объектов Worker, каждый из которых имеет отношение к WorkerPeriod, и я использую это отношение для выполнения запроса, проблема в том, что запрос isync и когда он возвращается из веб-службы, workerIndex перепуталисьБлок хранит var в Swift 2.1

workerQuery.whereKey("construction", equalTo: currentConstruction).findObjectsInBackgroundWithBlock({ (unsafeWorkers, error) -> Void in 
      guard let workers = unsafeWorkers as? [Worker] where error == nil && workers.count == 0 else { 
       return 
      } 

      for var workerIndex = 0; workerIndex < workers.count; workerIndex++ { 

       let currentWorker = workers[workerIndex] 


       if let periodQuery = WorkerPeriod.query() { 
        periodQuery.whereKey("worker", equalTo: currentWorker) 

        let weakWorkerIndex = workerIndex 
        print("weakWorkerIndex = \(weakWorkerIndex) worker \(workerIndex)") 
        periodQuery.findObjectsInBackgroundWithBlock({ (unsafeWorkerPeriod, error) -> Void in 

         guard let workerPeriods = unsafeWorkerPeriod as? [WorkerPeriod] where error == nil && workerPeriods.count != 0 else { 
          return 
         } 
         print("block weakWorkerIndex = \(weakWorkerIndex) workerIndex \(workerIndex)") 

         . 
         . 

        }) 
       } 
      } 

Я пытался создать «weakWorkerIndex» в позволении, чтобы удерживать значение, как мы это делали в Objective-C с __block переменные, но это не работает, блок-взаимодействие просто игнорирует значение, как вы можете видеть на выходе:

weakWorkerIndex = 0 worker 0 
weakWorkerIndex = 1 worker 1 
block weakWorkerIndex = 0 workerIndex 2 
block weakWorkerIndex = 0 workerIndex 2 
block weakWorkerIndex = 0 workerIndex 2 

К слову: я удалил ненужный код, чтобы упростить чтение.

ответ

0

В обработчике завершения, вам необходимо убедиться, что workerIndex будет захвачен значением и т.д .:

for var workerIndex = 0; workerIndex < 10; workerIndex++ { 
    fooAsync { [workerIndex] in 
     print("\(workerIndex)") 
    } 
} 

См Свифт Capture Lists