Junior — Middle
Πώς μπορεί να δημιουργηθεί ένας πίνακας προστατευμένος από ταυτόχρονες αλλαγές από πολλά νήματα;
sobes.tech AI
Απάντηση από AI
Για τη δημιουργία μιας array που προστατεύεται από ταυτόχρονες αλλαγές από πολλαπλά νήματα στο iOS (Swift), συνήθως χρησιμοποιείται ο συγχρονισμός πρόσβασης στην array. Ένας απλός τρόπος είναι να τυλίξετε την array σε μια κλάση και να χρησιμοποιήσετε το DispatchQueue με εργασίες barrier για εγγραφή και κανονικές εργασίες για ανάγνωση.
Παράδειγμα:
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
}
}
Αυτή η προσέγγιση επιτρέπει την ασφαλή ανάγνωση δεδομένων από την array παράλληλα, ενώ οι εγγραφές πραγματοποιούνται σειριακά, αποτρέποντας καταστάσεις ανταγωνισμού. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το NSLock ή άλλα μηχανισμούς συγχρονισμού, αλλά το DispatchQueue με barriers είναι μια πιο σύγχρονη και βολική μέθοδος.