Sobes.tech
Junior — Middle

As coleções em Swift são seguras para threads?

sobes.tech IA

Resposta da IA

As coleções em Swift (por exemplo, Array, Dictionary, Set) não são seguras para threads por padrão. Isso significa que o acesso simultâneo de vários threads sem sincronização pode levar a comportamentos imprevisíveis e erros.

Para trabalhar com segurança com coleções em um ambiente multithread, é necessário usar mecanismos de sincronização, por exemplo:

  • Filas DispatchQueue com barreiras (barrier) para escrita
  • NSLock ou outros objetos de bloqueio
  • Wrappers especializados seguros para threads

Exemplo de uso de DispatchQueue para acesso seguro a um array:

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

Portanto, para trabalhar com segurança com coleções em código multithread em Swift, é necessário aplicar mecanismos adicionais de sincronização.