Junior — Middle
Как да създадем масив, защитен срещу едновременни промени от няколко нишки?
sobes.tech AI
Отговор от AI
За създаване на масив, защитен срещу едновременни промени от няколко нишки в iOS (Swift), обикновено се използва синхронизиране на достъпа до масива. Един от простите начини е да обвиете масива в клас и да използвате DispatchQueue с бариерни задачи за запис и обикновени задачи за четене.
Пример:
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
}
}
Този подход позволява безопасно четене на данни от масива паралелно, докато записите се изпълняват последователно, предотвратявайки състезателни условия. Алтернативно може да се използва NSLock или други механизми за синхронизация, но DispatchQueue с бариери е по-модерен и удобен начин.