iOS'ta iş parçacıkları (bağlam) arasında nasıl veri senkronize edilir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Senkranizasyon için aşağıdaki mekanizmalar kullanılabilir:
-
NSLock: Basit bir kilit mutex.
let lock = NSLock() func doSomething() { lock.lock() // Kritik bölüm lock.unlock() } -
NSRecursiveLock: Bir thread'ün kilidi tekrar tekrar almasına izin verir, deadlock olmadan.
let recursiveLock = NSRecursiveLock() func recursiveFunction(level: Int) { recursiveLock.lock() if level < 3 { recursiveFunction(level: level + 1) } recursiveLock.unlock() } -
NSCondition: Thread'lerin belirli bir koşulu beklemesine izin verir, koşul sağlandığında devam eder.
let condition = NSCondition() var dataAvailable = false func producer() { condition.lock() // Veri üretimi dataAvailable = true condition.signal() // Bekleyen thread'lere sinyal gönder condition.unlock() } func consumer() { condition.lock() while !dataAvailable { condition.wait() // Koşul sağlanana kadar bekle } // Veri işleme dataAvailable = false condition.unlock() } -
NSConditionLock: Belirli bir koşul-değer sağlandığında alınabilen mutex.
let conditionLock = NSConditionLock(condition: 0) let DATA_READY = 1 func producer() { conditionLock.lock(when: 0) // Koşul 0 ise al // Veri üretimi conditionLock.unlock(withCondition: DATA_READY) // Kilidi serbest bırak ve koşulu DATA_READY yap } func consumer() { conditionLock.lock(when: DATA_READY) // Koşul DATA_READY ise al // Veri işleme conditionLock.unlock(withCondition: 0) // Kilidi serbest bırak ve koşulu 0 yap } -
Dispatch Queues (GCD): Paylaşılan kaynaklara erişim için sıralı dispatch kuyrukları kullanılır.
let serialQueue = DispatchQueue(label: "com.yourapp.serialQueue") var sharedResource = 0 func updateResource() { serialQueue.async { // Bu kuyruktan sadece sharedResource erişimi sharedResource += 1 } } -
NSOperationQueue: Bağımlılıkları ve öncelikleri kontrol etmeye olanak tanır.
let operationQueue = OperationQueue() var sharedOperationResource = 0 let operation1 = BlockOperation { // sharedOperationResource erişimi sharedOperationResource += 1 } operationQueue.addOperation(operation1) -
Actors (Swift 5.5+): Durum izolasyonunu sağlar, farklı bağlamlardan eşzamanlı erişimi engeller.
actor Counter { private var count = 0 func increment() { count += 1 } func getCount() -> Int { return count } } let counter = Counter() Task { await counter.increment() let currentCount = await counter.getCount() print(currentCount) } -
Core Data Contexts: Veri bağlamlarını senkronize etmek için hiyerarşik bağlamlar (ebeveyn-torun) veya mergeChanges(fromContextDidSaveNotification:) kullanılabilir.
// Hiyerarşi örneği (ebeveyn - arka plan, çocuk - UI) let privateMoc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateMoc.persistentStoreCoordinator = persistentStoreCoordinator let mainMoc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) mainMoc.parent = privateMoc // mergeChanges örneği NotificationCenter.default.addObserver(self, selector: #selector(contextDidSave(_:)), name: .NSManagedObjectContextDidSave, object: nil) @objc func contextDidSave(_ notification: Notification) { guard let savingContext = notification.object as? NSManagedObjectContext else { return } if savingContext != mainMoc { // Ana bağlamda değilse kaydetme mainMoc.perform { mainMoc.mergeChanges(fromContextDidSave: notification) } } } -
Atomik işlemler: Basit işlemler için atomik primitive'ler (örneğin,
os/lock.h'den) kullanılır.
Yöntem seçimi, görevin karmaşıklığına, veri tipine ve performans gereksinimlerine bağlıdır. Actor'lar ve GCD modern ve tercih edilen yaklaşımlardır.