Sobes.tech
Middle+

როგორ შევინარჩუნოთ მონაცემების სინქრონიზაცია ნაკადებს შორის და უზრუნველვყოთ კონტექსტის თანმიმდევრულობა?

sobes.tech AI

პასუხი AI-სგან

Даталардын синхрондоштуруу жана контексттин шайкештигин камсыздоо үчүн iOSтогу көптөгөн агымдуу колдонмодо төмөнкү ыкмалар колдонулат:

  1. NSLock / Lock: Параллелдүү коддун критикалык бөлүмдөрүн блоктоо үчүн колдонулган жөнөкөй мьютекс:

    import Foundation
    
    class ThreadSafeCounter {
        private var count: Int = 0
        private let lock = NSLock()
    
        func increment() {
            lock.lock()
            defer { lock.unlock() }
            count += 1
        }
    
        func getCount() -> Int {
            lock.lock()
            defer { lock.unlock() }
            return count
        }
    }
    
  2. NSRecursiveLock: Ошол эле агымдан кайрадан зымдарды алуу мүмкүнчүлүгүн берет:

    import Foundation
    
    class RecursiveLocker {
        private let lock = NSRecursiveLock()
    
        func firstMethod() {
            lock.lock()
            defer { lock.unlock() }
            print("Биринчи метод")
            secondMethod() // Кайталап алуу мүмкүн
        }
    
        func secondMethod() {
            lock.lock()
            defer { lock.unlock() }
            print("Экинчи метод")
        }
    }
    
  3. NSCondition / NSConditionLock: Агымдар белгилүү бир шартты (Condition) күтүшү же маанини (ConditionLock) күтүшү үчүн колдонулат:

    import Foundation
    
    class Buffer {
        private var items: [Int] = []
        private let condition = NSCondition()
        private let capacity = 5
    
        func addItem(_ item: Int) {
            condition.lock()
            defer { condition.unlock() }
    
            while items.count == capacity {
                condition.wait() // бош орун пайда болгонча күтөт
            }
    
            items.append(item)
            print("Кошулду: \(item), Учурдагы буфер: \(items)")
            condition.signal() // агымдарга сигнал берет
        }
    
        func removeItem() -> Int {
            condition.lock()
            defer { condition.unlock() }
    
            while items.isEmpty {
                condition.wait() // элемент пайда болгонча күтөт
            }
    
            let item = items.removeFirst()
            print("Өзгөртүлдү: \(item), Учурдагы буфер: \(items)")
            condition.signal() // орун пайда болгонча күтүп жаткан агымдарга сигнал
            return item
        }
    }
    
  4. **Grand Central Dispatch (GCD):

    • Serial Queues: Маселелерди биринин артынан бирин иштетет, бул ресурстарга атомардуу кирүүгө кепилдик берет.

    • Concurrent Queues with Barrier Flags: Окууну бирдей ишке ашырат, бирок жазуу операциялары эксклюзивдүү жүргүзүлөт:

      import Foundation
      
      class ThreadSafeArray<Element> {
          private var array: [Element] = []
          private let queue = DispatchQueue(label: "com.mycompany.threadsafearray", attributes: .concurrent) // Конкуренттик кезек
      
          func append(_ newElement: Element) {
              queue.async(flags: .barrier) { // Барьер жазуу үчүн
                  self.array.append(newElement)
              }
          }
      
          func get(at index: Int) -> Element? {
              var result: Element?
              queue.sync { // Окуу үчүн синхрондоо
                  if index < self.array.count {
                      result = self.array[index]
                  }
              }
              return result
          }
      }
      
  5. Core Data Контекст операциялары: Ар бир NSManagedObjectContext өзүнүн жеке сериалдуу агымына ээ:

    import CoreData
    
    // Core Data контекстинде сактоо мисалы
    let context = // алынган контекст
    context.perform { // Контексттин жеке агымында иштөө
        // Core Data объекттери менен иштөө
        do {
            try context.save()
        } catch {
            // катаны иштетүү
        }
    }
    

Тандоо конкретдик тапшырмага жана аткаруу талаптарына жараша болот. GCD менен сериалдуу кезектер же конкуреттик кезектер менен барьерлер көбүнчө эң ылайыктуу ыкма болуп саналат, анткени ал эффективдүү жана колдонууга ыңгайлуу. Core Data үчүн мүмкүн болушунча perform же performAndWait ыкмаларын колдонуңуз.