捕获队列中的数组

时间:2015-03-04 23:08:54

标签: swift closures grand-central-dispatch

我有以下在后台工作的功能。 每个工作单元都添加到并发工作队列中。 然后将结果添加到数组(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)}

1 个答案:

答案 0 :(得分:1)

根据docs swift应自动确定是否需要按引用或值捕获:

  

Swift确定应该通过引用捕获什么以及应该捕获什么   被价值复制。您无需注释金额或runningTotal   说它们可以在嵌套的增量函数中使用。   Swift还处理涉及处理的所有内存管理   当增量函数不再需要runningTotal时。

但是,这似乎不适用于您的情况。

建议您尝试在捕获列表中包含对数组的弱引用:

    dispatch_sync(sharedResourceQueue) { 
       [weak sharedArray] in                  
       sharedArray.append(value);
       println("tally \(sharedArray.count) | \(sharedArray)")
   }