როგორ შევინარჩუნოთ მონაცემები ნაკადებს შორის (კონტექსტი) iOS-ში?
sobes.tech AI
პასუხი AI-სგან
Синхрондоштуруу үчүн төмөнкү механизмдерди колдонсо болот:
-
NSLock: Примитивдүү блоктоочу мьютекс.
let lock = NSLock() func doSomething() { lock.lock() // Критикалык бөлүмдүн коду lock.unlock() } -
NSRecursiveLock: Бир поток көп жолу блокировканы алууга мүмкүндүк берет, дедлоксуз.
let recursiveLock = NSRecursiveLock() func recursiveFunction(level: Int) { recursiveLock.lock() if level < 3 { recursiveFunction(level: level + 1) } recursiveLock.unlock() } -
NSCondition: Токендерге белгилүү шартты күтүүгө мүмкүндүк берет, андан кийин ишке ашыруу.
let condition = NSCondition() var dataAvailable = false func producer() { condition.lock() // Маалымат өндүрүү dataAvailable = true condition.signal() // Сигнал берүү күтүп жаткан токендерге condition.unlock() } func consumer() { condition.lock() while !dataAvailable { condition.wait() // Күтүү, шарт аткарылмайынча } // Маалыматты иштетүү dataAvailable = false condition.unlock() } -
NSConditionLock: Белгилүү шарт-баалуулук аткарылганда гана алууга болот.
let conditionLock = NSConditionLock(condition: 0) let DATA_READY = 1 func producer() { conditionLock.lock(when: 0) // Залп, шартында алуу // Маалымат өндүрүү conditionLock.unlock(withCondition: DATA_READY) // Блоктоону бошотуп, DATA_READY шартын коюу } func consumer() { conditionLock.lock(when: DATA_READY) // Залп, шартында алуу // Маалыматты иштетүү conditionLock.unlock(withCondition: 0) // Блоктоону бошотуп, 0 шартын коюу } -
Dispatch Queues (GCD): Жалгыз тартиптүү dispatch-лерди колдонуу аркылуу жалпы ресурстарга кирүү.
let serialQueue = DispatchQueue(label: "com.yourapp.serialQueue") var sharedResource = 0 func updateResource() { serialQueue.async { // sharedResourceке гана ушул кезек аркылуу кирүү sharedResource += 1 } } -
NSOperationQueue: Тартиптердин көзкарандылыгын жана артыкчылыктарын көзөмөлдөө.
let operationQueue = OperationQueue() var sharedOperationResource = 0 let operation1 = BlockOperation { // sharedOperationResourceке кирүү sharedOperationResource += 1 } operationQueue.addOperation(operation1) -
Actors (Swift 5.5+): Статусту изоляциялоо, ар кандай контексттерден бир убакта кирүүгө тоскоолдук кылуу.
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 контексттерин синхрондоштуруу үчүн hierarchical contexts (ата-эне-балдар) же mergeChanges(fromContextDidSaveNotification:) колдонсо болот.
// Иерархия менен мисал (ата-эне - фон, балдар - UI) let privateMoc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateMoc.persistentStoreCoordinator = persistentStoreCoordinator let mainMoc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) mainMoc.parent = privateMoc // mergeChanges мисалы 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 { // Эгер сактоо негизги контекстте болбосо mainMoc.perform { mainMoc.mergeChanges(fromContextDidSave: notification) } } } -
Атомардык операциялар: Жөнөкөй операциялар үчүн атомардык примитивдерди колдонуу (мисалы,
os/lock.h-дан).
Тандоо тапшырган татаалдыгына, маалымат түрүнө жана талап кылынган иштөө ылдамдыгына жараша болот. Actors жана GCD заманбап жана сунушталган ыкмалар болуп саналат.