如何在swift中实现并行映射

时间:2017-03-06 07:04:29

标签: ios swift concurrency parallel-processing

我有以下代码: -

Select2JQueryEventObject

在这里的return语句res中,它经常返回部分执行完成。有道理,并发Perform是非阻塞的。我不确定如何继续等待它。我应该使用像调度组/期望这样的东西还是有一些更简单更优雅的方法?基本上我在swift中寻找一个简单的等待通知抽象。

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

// EZSE : A parralelized map for collections, operation is non blocking
public func pmap<R>(_ each: @escaping (Self.Iterator.Element) -> R) -> [R?] {
    let indices = indicesArray()
    var res = [R?](repeating: nil, count: indices.count)

    let queue = OperationQueue()
    let operations = indices.enumerated().map { index, elementIndex in
        return BlockOperation {
            res[index] = each(self[elementIndex])
        }
    }
    queue.addOperations(operations, waitUntilFinished: true)

    return res
}

答案 1 :(得分:1)

@ user28434的答案很好,可以通过使用concurrentPerform使其更快:

extension Collection {
    func parallelMap<R>(_ transform: @escaping (Element) -> R) -> [R] {
        var res: [R?] = .init(repeating: nil, count: count)

        let lock = NSRecursiveLock()
        DispatchQueue.concurrentPerform(iterations: count) { i in
            let result = transform(self[index(startIndex, offsetBy: i)])
            lock.lock()
            res[i] = result
            lock.unlock()
        }

        return res.map({ $0! })
    }
}

相比之下,在我正在运行的任务上使用OperationQueue()(在10,000个项目上并行运行我的某些功能)平均使用100次运行:

  • concurrentPerform平均花费0.060秒。
  • OperationQueue()平均花费0.087秒。