gpt4 book ai didi

swift - 在 Swift 2.1 中阻止存储的变量

转载 作者:搜寻专家 更新时间:2023-11-01 05:37:28 25 4
gpt4 key购买 nike

所以,我正在做一个返回多个 Worker 对象的异步查询,每个 Worker 都与 WorkerPeriod 有关系,我使用这个关系来做查询,问题是,查询是异步的,当它返回时从 Web 服务,workerIndex 乱七八糟

 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”作为 let 来保存值,就像我们在 Objective-C 中使用 __block 变量所做的那样,但这不起作用, block 交互只是忽略了值,如您所见在输出中:

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

顺便说一句:我删除了所有不必要的代码以简化阅读。

最佳答案

在完成处理程序中,您需要确保workerIndex 将被按值 捕获,例如:

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

参见 Swift Capture Lists

关于swift - 在 Swift 2.1 中阻止存储的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35159835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com