Sobes.tech
Junior — Middle

Kaip sukurti masyvą, apsaugotą nuo vienu metu vykstančių pakeitimų iš kelių srautų?

sobes.tech AI

Atsakymas iš AI

Sukuriant masyvą, apsaugotą nuo vienalaikių pakeitimų kelių srautų, dažnai naudojama prieigos sinchronizacija prie masyvo iOS (Swift). Paprastas būdas yra apgaubti masyvą klasėje ir naudoti DispatchQueue su barjerinėmis užduotimis rašymui ir įprastomis užduotimis skaitymui.

Pavyzdys:

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

Šis požiūris leidžia saugiai ir paraleliai skaityti duomenis iš masyvo, o rašymo operacijos vykdomos sekos tvarka, užkertant kelią duomenų varžyboms. Alternatyviai galima naudoti NSLock ar kitus sinchronizacijos mechanizmus, tačiau DispatchQueue su barjerais yra modernesnis ir patogesnis būdas.