Sobes.tech
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 ბარიერებით არის უფრო თანამედროვე და მოსახერხებელი მეთოდი.