iOSda oqimlar (konttekst) o'rtasida ma'lumotlarni qanday sinxronlashtirish mumkin?
sobes.tech AI
AIdan javob
Sinxronizatsiya uchun quyidagi mexanizmlardan foydalanish mumkin:
-
NSLock: Oddiy bloklovchi mutex.
let lock = NSLock() func doSomething() { lock.lock() // Kritikal bo'lim kodi lock.unlock() } -
NSRecursiveLock: Bir oqimga bir necha marta blokirovka qilish imkonini beradi, deadlocksiz.
let recursiveLock = NSRecursiveLock() func recursiveFunction(level: Int) { recursiveLock.lock() if level < 3 { recursiveFunction(level: level + 1) } recursiveLock.unlock() } -
NSCondition: Oqimlar ma'lum bir shartni kutishlari uchun imkon beradi.
let condition = NSCondition() var dataAvailable = false func producer() { condition.lock() // Ma'lumot ishlab chiqarish dataAvailable = true condition.signal() // Kutayotgan oqimlarga signal berish condition.unlock() } func consumer() { condition.lock() while !dataAvailable { condition.wait() // Shart bajarilishini kutish } // Ma'lumotlarni ishlash dataAvailable = false condition.unlock() } -
NSConditionLock: Faqat ma'lum bir shart-qiymat bajarilganida blokni olish mumkin bo'lgan mutex.
let conditionLock = NSConditionLock(condition: 0) let DATA_READY = 1 func producer() { conditionLock.lock(when: 0) // 0 sharti bilan blokni olish // Ma'lumot ishlab chiqarish conditionLock.unlock(withCondition: DATA_READY) // Blokni ochish va DATA_READY shartini o'rnatish } func consumer() { conditionLock.lock(when: DATA_READY) // DATA_READY sharti bilan blokni olish // Ma'lumotlarni ishlash conditionLock.unlock(withCondition: 0) // Blokni ochish va shartni 0 ga o'rnatish } -
Dispatch Queues (GCD): Umumiy resurslarga kirishni ketma-ket dispath-queues yordamida boshqarish.
let serialQueue = DispatchQueue(label: "com.yourapp.serialQueue") var sharedResource = 0 func updateResource() { serialQueue.async { // sharedResource ga faqat bu queue dan kirish sharedResource += 1 } } -
NSOperationQueue: Operatsiyalar orasidagi bog'liqlik va prioritetlarni boshqarish imkonini beradi.
let operationQueue = OperationQueue() var sharedOperationResource = 0 let operation1 = BlockOperation { // sharedOperationResource ga kirish sharedOperationResource += 1 } operationQueue.addOperation(operation1) -
Actors (Swift 5.5+): Holatni izolyatsiya qilish va bir vaqtning o'zida kirishni oldini oladi.
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: Data kontekstlarini sinxronlashtirish uchun hierarchical contexts (ota-ota) yoki mergeChanges(fromContextDidSaveNotification:) dan foydalanish mumkin.
// Hierarchical misol (ota - fon, o'g'il - UI) let privateMoc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateMoc.persistentStoreCoordinator = persistentStoreCoordinator let mainMoc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) mainMoc.parent = privateMoc // mergeChanges misoli 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 { // Asosiy kontekstda bo'lmagan saqlash mainMoc.perform { mainMoc.mergeChanges(fromContextDidSave: notification) } } } -
Atomic operations: Oddiy operatsiyalar uchun atomar primitivlardan foydalanish (masalan,
os/lock.hdan).\n Usul tanlash vazifaning murakkabligiga, ma'lumotlar turiga va talab qilingan ishlash tezligiga bog'liq. Actors va GCD zamonaviy va afzal ko'rilgan yondashuvlardir.