ios - 如何并发更新数组?

标签 ios arrays swift concurrency nsoperationqueue

我正在努力实现这一点: 我有四个数组和一个可以改变它们的函数“calculateResult”。这些数组的元素个数为 2^n,其中 n 是用户定义的值。该函数在循环中调用(例如,在实际项目中,迭代次数可以是 2^10)。 然后将数组分成多个部分(在实际项目中,部分数量 = 处理器数量)和“calculateResult”在此部分范围内并行。

我需要的具体情况(数组计数 = 2^10 = 1024,零件数 = 4):

import Foundation

    func calculateResult(inRange calculationRange: CountableClosedRange<Int>) -> (ArraySlice<Double>, ArraySlice<Double>, ArraySlice<Double>, ArraySlice<Double>) {
        var array1 = Array(repeating: 0.0, count: calculationRange.count)
        var array2 = Array(repeating: 0.0, count: calculationRange.count)
        var array3 = Array(repeating: 0.0, count: calculationRange.count)
        var array4 = Array(repeating: 0.0, count: calculationRange.count)

        var iRes = 0
        for i in calculationRange {
            array1[iRes] = Double(i * 1)
            array2[iRes] = Double(i * 10)
            array3[iRes] = Double(i * 100)
            array4[iRes] = Double(i * 1000)

            iRes += 1
        }

        return (ArraySlice(array1), ArraySlice(array2), ArraySlice(array3), ArraySlice(array4))
    }

    var result1 = Array(repeating: 0.0, count: 1024)
    var result2 = Array(repeating: 0.0, count: 1024)
    var result3 = Array(repeating: 0.0, count: 1024)
    var result4 = Array(repeating: 0.0, count: 1024)

    func calculateResConcurrent() {
        let operationQueue = OperationQueue.init()

        let op1 = BlockOperation.init {
            print("Operation \(0)...")
            (result1[0...255], result2[0...255], result3[0...255], result4[0...255]) = calculateResult(inRange: 0...255)
            print("Operation \(0) DONE")
        }
        let op2 = BlockOperation.init {
            print("Operation \(1)...")
            (result1[256...511], result2[256...511], result3[256...511], result4[256...511]) = calculateResult(inRange: 256...511)
            print("Operation \(1) DONE")
        }
        let op3 = BlockOperation.init {
            print("Operation \(2)...")
            (result1[512...767], result2[512...767], result3[512...767], result4[512...767]) = calculateResult(inRange: 512...767)
            print("Operation \(2) DONE")
        }
        let op4 = BlockOperation.init {
            print("Operation \(3)...")
            (result1[768...1023], result2[768...1023], result3[768...1023], result4[768...1023]) = calculateResult(inRange: 768...1023)
            print("Operation \(3) DONE")
        }

        operationQueue.addOperations([op1, op2, op3, op4], waitUntilFinished: true)
    }

    let numberOfIterations = 200
    for i in 0...numberOfIterations {
        print("\nMain iteration \(i) of \(numberOfIterations)")
        calculateResConcurrent()
    }

    print("")
    print(result1.last!, result2.last!, result3.last!, result4.last!) //Correct result is: (1023.0, 10230.0, 102300.0, 1023000.0)

我运行它,有时它崩溃并出现错误:“ fatal error :UnsafeMutablePointer.deinitialize with negative count”或返回错误结果。 请帮我找出错误并意识到这一点 :-) 我是 swift 的新手。

最佳答案

您最终可以做的是引入一个 DispatchQueue 以同步写入数组,并通过 BlockOperation 继续并发运行您的其余逻辑,因此您的功能可能是:

let queue = DispatchQueue(label: "syncQueue")

func calculateResConcurrent() {
    let operationQueue = OperationQueue.init()
    operationQueue.maxConcurrentOperationCount = 4
    let ops:[BlockOperation] = [0...255, 256...511, 512...767, 768...1023].map { range in
        let op = BlockOperation.init(block: {
            let res = calculateResult(inRange: range) // concurrent
            queue.sync(execute: { // synchronous
                result1.replaceSubrange(range, with: res.0)
                result2.replaceSubrange(range, with: res.1)
                result3.replaceSubrange(range, with: res.2)
                result4.replaceSubrange(range, with: res.3)
            })
            print("Operation \(range) finished")
        })
        return op
    }
    operationQueue.addOperations(ops, waitUntilFinished: true)
}

关于ios - 如何并发更新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48780018/

相关文章:

ios - UIBezierpath 没有绘制平滑的图像

objective-c - CCLabelTTF 中的行间距

python - 找到最重复的! np.数组!在列表中

javascript - 将对象属性中的数组合并到对象数组中

swift - typealias as emoji with invalid expression 表情符号

regex - 如何使用正则表达式拆分字符串

swift - 在 Swift 中为闭包分配属性

ios - table-view 上下移动,像在不停地跳跃

javascript - 附加选项列表但删除以前的选项

ios - 如何使用MDCardCollectionCell? [iOS Material 组件]