Sobes.tech
Junior — Middle

Hoe maak je een array die beschermd is tegen gelijktijdige wijzigingen door meerdere threads?

sobes.tech AI

Antwoord van AI

Om een array te maken die beschermd is tegen gelijktijdige wijzigingen door meerdere threads in iOS (Swift), wordt gewoonlijk toegang tot de array gesynchroniseerd. Een eenvoudige manier is om de array in een klasse te wikkelen en DispatchQueue te gebruiken met barrier-taken voor schrijven en normale taken voor lezen.

Voorbeeld:

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

Deze aanpak maakt het mogelijk om veilig parallel gegevens uit de array te lezen, terwijl schrijfbewerkingen sequentieel worden uitgevoerd, waardoor racecondities worden voorkomen. Alternatief kan NSLock of andere synchronisatie-mechanismen worden gebruikt, maar DispatchQueue met barrières is een modernere en handigere methode.