我有以下在后台工作的功能。 每个工作单元都添加到并发工作队列中。 然后将结果添加到数组(sharedArray)。
但是数组的值永远不会正确。它总是1.这可能是因为每次都会复制数组。我怎样才能获得对数组的引用?
//input
let testValues = ["a","b","c"]
dispatch_async(self.concurrentQueue) {
//pool results
let sharedResourceQueue = dispatch_queue_create("processed", DISPATCH_QUEUE_SERIAL) //protect the shared resource
var sharedArray : [String] = []
// processing
autoreleasepool { //only usefull for obj-c and cocoa classes
for value in testValues
{
self.process(value) { processedValue in
dispatch_async(dispatch_get_main_queue()) { println(processedValue) } //intermediate callback
dispatch_sync(sharedResourceQueue) {
sharedArray.append(value);
println("tally \(sharedArray.count) | \(sharedArray)")
}
}
}
}
dispatch_sync(sharedResourceQueue) {}//wait for completion
//save results and report back
dispatch_async(dispatch_get_main_queue()) {println(sharedArray)}
答案 0 :(得分:1)
根据docs swift应自动确定是否需要按引用或值捕获:
Swift确定应该通过引用捕获什么以及应该捕获什么 被价值复制。您无需注释金额或runningTotal 说它们可以在嵌套的增量函数中使用。 Swift还处理涉及处理的所有内存管理 当增量函数不再需要runningTotal时。
但是,这似乎不适用于您的情况。
建议您尝试在捕获列表中包含对数组的弱引用:
dispatch_sync(sharedResourceQueue) {
[weak sharedArray] in
sharedArray.append(value);
println("tally \(sharedArray.count) | \(sharedArray)")
}