Sobes.tech
Middle

Kā īstenot daudzvirzienu, izmantojot rindas?

sobes.tech AI

Atbilde no AI

Lai īstenotu daudzprocesoru darbību iOS, tiek izmantotas GCD (Grand Central Dispatch) vai Operation Queues tehnoloģijas.

GCD (Grand Central Dispatch)

GCD ir zema līmeņa C API, kas paredzēta paralēlo uzdevumu pārvaldībai, izmantojot dispečera rindas.

Galvenās GCD koncepcijas:

  • Dispečera rindas (Dispatch Queues): Datu struktūras, kas pārvalda kodu blokus (uzdevumus). Tās var būt secīgas (serial) vai paralēlas (concurrent).
  • Globālās paralēlās rindas (Global Concurrent Queues): Sistēmas rindas, kas pieejamas pēc noklusējuma, atšķiras pēc prioritātes (qos - Quality of Service).
  • Galvenā rinda (Main Queue): Tā ir secīga rinda, kas ir saistīta ar galveno UI plūsmu. To izmanto lietotāja saskarnes atjaunināšanai.

GCD piemērs:

import Foundation

// Saņemt augstas prioritātes globālo paralēlo rindu
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Saņemt galveno rindu
let mainQueue = DispatchQueue.main

// Asinhroni izpildīt uzdevumu globālajā rindā
globalQueue.async {
    // Veikt ilgstošu uzdevumu...
    print("Veic fonā")

    // Pāriet uz galveno rindu UI atjaunināšanai (ja nepieciešams)
    mainQueue.async {
        // Atjaunināt UI...
        print("UI atjaunināšana galvenajā plūsmā")
    }
}

// Izveidot un izmantot lietotāja izveidotu secīgu rindu
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")

serialQueue.async {
    print("Uzdevums 1 rindā")
}

serialQueue.async {
    print("Uzdevums 2 rindā") // Tiks izpildīts pēc Uzdevuma 1
}

Operation Queues

Operation Queues ir augstākā līmeņa abstrakcija virs GCD, kas balstīta uz Operation objektiem.

Galvenās Operation Queues koncepcijas:

  • Operācijas (Operation): Objekti, kas pārstāv darba vienību. Tie var būt Operation apakšklases (piemēram, BlockOperation, URLSessionDownloadTask). Atbalsta atkarības starp operācijām.
  • Operāciju rindas (OperationQueue): Objekti, kas pārvalda Operation izpildi. Tos var konfigurēt, lai ierobežotu vienlaicīgi izpildāmo operāciju skaitu (maxConcurrentOperationCount).

Piemērs, kā izmantot Operation Queues:

import Foundation

// Izveidot operāciju rindu
let operationQueue = OperationQueue()

// Pēc izvēles: ierobežot vienlaicīgi izpildāmo operāciju skaitu
operationQueue.maxConcurrentOperationCount = 3

// Izveidot operāciju
let operation1 = BlockOperation {
    print("Operācija 1 tiek izpildīta")
    // Veikt uzdevumu...
}

let operation2 = BlockOperation {
    print("Operācija 2 tiek izpildīta")
    // Veikt uzdevumu...
}

// Izveidot operāciju ar slēdža palīdzību (alternatīvs veids)
let operation3 = BlockOperation {
    print("Operācija 3 tiek izpildīta")
    // Veikt uzdevumu...
}

// Pievienot pabeigšanas slēdzi
operation3.completionBlock = {
    print("Operācija 3 pabeigta")
}

// Pievienot atkarības (Operācija 2 tiks izpildīta pēc Operācijas 1)
operation2.addDependency(operation1)

// Pievienot operācijas rindai
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// Operācijas sāksies izpildīt asinhroni, atkarībā no pieejamajām pavedieniem un atkarībām

GCD un Operation Queues salīdzinājums:

Raksturlielums GCD (Grand Central Dispatch) Operation Queues
Abstrakcijas līmenis Zems (C API) Augsts (Objective-C/Swift klases)
Uzdevumu pārvaldība Bloki vai funkcijas Operation objekti
Atkarības Prasa manuālu pārvaldību (piemēram, DispatchGroup) Iebūvēta atbalsts caur addDependency
Atcelšana Grūti Viegli (caur cancel() metodi)
Stāvoklis Nav skaidras stāvokļa Atbalsta stāvokļus (gatavs, izpildes, pabeigts)
Uzraudzība Prasa manuālu realizāciju KVO (Key-Value Observing) atbalsts
Sarežģītība Labāk piemērots vienkāršām, neatsakāmām uzdevumiem Labāk piemērots sarežģītām, savstarpēji atkarīgām, atceļamām uzdevumiem

Izvēle starp GCD un Operation Queues ir atkarīga no uzdevuma specifikas. GCD ir vieglāks un piemērots vienkāršām fonu uzdevumiem. Operation Queues nodrošina lielāku elastību pārvaldībā, atkarību un atcelšanas atbalstā, padarot tās par labāku izvēli sarežģītākiem uzdevumu pārvaldības scenārijiem. Lielākajā daļā gadījumu Operation Queues ir būvētas virs GCD.