Junior — Middle
Kako napraviti niz zaštićen od istovremenih promena iz više niti?
sobes.tech АИ
Одговор од АИ
Za kreiranje niza zaštićenog od istovremenih promena iz više niti u iOS (Swift), obično se koristi sinhronizacija pristupa nizu. Jedan od jednostavnih načina je da obmotate niz u klasu i koristite DispatchQueue sa barijer zadacima za zapis i običnim zadacima za čitanje.
Primer:
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
}
}
Ovaj pristup omogućava sigurno čitanje podataka iz niza paralelno, dok se upisi izvršavaju sekvencijalno, sprečavajući trke podataka. Alternativno, može se koristiti NSLock ili drugi mehanizmi za sinhronizaciju, ali DispatchQueue sa barijerama je moderniji i zgodniji način.