Sobes.tech
Middle

Kas on võimalik rakendada sünkroniseerimist (synchronized) muutujale?

sobes.tech AI

Vastus AI-lt

Ei, sõnas synchronized Swiftis ei eksisteeri. Juurdepääsu sünkroneerimiseks mitme niidiga keskkondades kasutatakse teisi mehhanisme:

  • Dispatch Queue: Järjekorrad võimaldavad koodi plokke järjestikuliselt täita, tagades, et ainult üks niit töötab muutujaga korraga.

    // Sünkroneerimise järjekord
    let queue = DispatchQueue(label: "com.myapp.syncQueue")
    
    var sharedVariable = 0
    
    func updateSharedVariable() {
        queue.sync {
            // Sünkroneeritud juurdepääs muutujale järjekorras
            sharedVariable += 1
            print(sharedVariable)
        }
    }
    
  • NSLock/NSRecursiveLock: Võimaldavad blokeerida juurdepääsu koodilõigule.

    import Foundation
    
    let lock = NSLock()
    var sharedArray = [Int]()
    
    func addToSharedArray(value: Int) {
        lock.lock() // Mutex haaramine
        sharedArray.append(value)
        print("Lisatud: \(value). Massiiv: \(sharedArray)")
        lock.unlock() // Mutex vabastamine
    }
    
  • Operations ja Operation Queue: Pakuvad kõrgema taseme meetodit paralleelsete ülesannete haldamiseks, sealhulgas sõltuvused ja prioriteedid.

  • @synchronized (Objective-C): Objective-C-is oli sarnane mehhanism, kuid see ei ole otse Swiftis saadaval ning nõuab sillatõlkeid Objective-C-iga. Soovitatav on kasutada Swift-omaseid lahendusi (Dispatch Queues, Locks).

Põhimõtte valik sõltub ülesande spetsiifikast. Dispatch Queue on sageli kõige mugavam ja tõhusam viis lihtsaks juurdepääsu sünkroneerimiseks andmetele.