Sobes.tech
Junior — Middle

Kuidas luua massiiv, mis on kaitstud samaaegsete muudatuste eest mitme niidiga?

sobes.tech AI

Vastus AI-lt

Selleks, et luua massiiv, mis on kaitstud samaegsete muudatuste eest mitme niidiga iOS-is (Swift), kasutatakse tavaliselt juurdepääsu sünkroniseerimist massiivile. Üks lihtne viis on massiiv pakkida klassi ja kasutada DispatchQueue barjääriülesannete jaoks kirjutamiseks ja tavalisi ülesandeid lugemiseks.

Näide:

class ThreadSafeArray<T> {
    private var array: [T] = []
    private let queue = DispatchQueue(label: "com.example.threadSafeArray", attributes: .concurrent)

    func append(_ element: T) {
        queue.async(flags: .barrier) {
            self.array.append(element)
        }
    }

    func get(at index: Int) -> T? {
        var result: T?
        queue.sync {
            if array.indices.contains(index) {
                result = array[index]
            }
        }
        return result
    }

    var count: Int {
        var result = 0
        queue.sync {
            result = array.count
        }
        return result
    }
}

See lähenemine võimaldab turvaliselt ja paralleelselt lugeda andmeid massiivist, samal ajal kui kirjutamised toimuvad järjestikku, vältides andmetega võistlemist. Alternatiivina võib kasutada NSLock või muid sünkroneerimismehhanisme, kuid DispatchQueue barjääridega on kaasaegsem ja mugavam meetod.