Sobes.tech
Junior — Middle
81

Каким образом можно создать массив, защищенный от одновременных изменений из нескольких потоков?

Companies where asked
Разумные решенияРазумные решения
Дунайс

Answer from AI

sobes.tech 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 с барьерами — более современный и удобный способ.