Junior — Middle
Ako vytvoriť pole chránené pred súčasnými zmenami z viacerých vlákien?
sobes.tech AI
Odpoveď od AI
Za vytvorenie poľa chráneného pred súčasnými zmenami z viacerých vlákien v iOS (Swift) sa zvyčajne používa synchronizácia prístupu k poľu. Jednoduchý spôsob je zabalit pole do triedy a použiť DispatchQueue s bariérovými úlohami pre zápis a bežnými úlohami pre čítanie.
Príklad:
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
}
}
Tento prístup umožňuje bezpečné čítanie dát z poľa paralelne, zatiaľ čo zápisy sa vykonávajú sekvenčne, čím sa predchádza súťažiam o dáta. Alternatívne je možné použiť NSLock alebo iné mechanizmy synchronizácie, ale DispatchQueue s bariérami je modernejší a pohodlnejší spôsob.