Sobes.tech
Junior — Middle

Cum se creează un array protejat împotriva modificărilor simultane din mai multe fire?

sobes.tech AI

Răspuns de la AI

Pentru a crea un array protejat împotriva modificărilor simultane din mai multe fire în iOS (Swift), se folosește de obicei sincronizarea accesului la array. O metodă simplă este să înveliți array-ul într-o clasă și să folosiți DispatchQueue cu sarcini de tip barieră pentru scriere și sarcini normale pentru citire.

Exemplu:

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
    }
}

Această abordare permite citirea sigură a datelor din array în paralel, în timp ce scrierile se realizează secvențial, prevenind condițiile de cursă. Alternativ, se poate folosi NSLock sau alte mecanisme de sincronizare, dar DispatchQueue cu bariere este o metodă mai modernă și mai convenabilă.