Sobes.tech
Middle

Kas ir darbs ar pavedieniem, kas atšķiras no galvenā pavediena (off main thread)?

sobes.tech AI

Atbilde no AI

Darbs ar pavedieniem, kas atšķiras no galvenā, ietver resursu vai ilgstošu operāciju (piemēram, tīkla pieprasījumi, datu apstrāde, datu bāzes darbi) veikšanu fonā, lai neapturētu galveno pavedienu (UI Thread). Tas ir kritiski svarīgi, lai saglabātu lietotāja saskarnes atsaucību.

iOS tas visbiežāk tiek izmantots:

  1. Grand Central Dispatch (GCD): Augstas veiktspējas tehnoloģija paralēlai un konkurējošai uzdevumu izpildei:

    • Priekšrocības: Vienkārša lietošana, automātiska pavedienu pulu pārvaldība, veiktspējas optimizācija.
    • Trūkumi: Grūtības atcelt operācijas, mazāk elastīga uzdevumu dzīves cikla pārvaldība, salīdzinot ar Operation Queues.

    GCD lietošanas piemērs:

    // Izpildīt uzdevumu globālajā rindā (fonā)
    DispatchQueue.global(qos: .userInitiated).async {
        // Jūsu kods, kas veic ilgu operāciju
        print("Veic fonā")
    
        // Pēc pabeigšanas, ja nepieciešams, atjauniniet UI, atgriezieties galvenajā pavedienā
        DispatchQueue.main.async {
            // UI atjaunināšana
            print("Atjaunināt UI galvenajā pavedienā")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): Objektu orientēta pārklājums pār GCD, kas ļauj elastīgāk pārvaldīt uzdevumus:

    • Priekšrocības: Atkarību pārvaldība starp operācijām, iespēja atcelt operācijas, vienkārša atkārtota izmantošana un pauze.
    • Trūkumi: Nedaudz sarežģītāka sintakse nekā GCD vienkāršiem uzdevumiem.

    Piemērs:

    // Izveidot operāciju rindu
    let operationQueue = OperationQueue()
    
    // Izveidot operāciju (var izmantot BlockOperation vai izveidot savu klasi, kas manto no Operation)
    let myOperation = BlockOperation {
        // Jūsu kods, kas veic ilgu operāciju
        print("Veic fonā operāciju")
    }
    
    // Pievienot operāciju rindai
    operationQueue.addOperation(myOperation)
    
  3. Manual Threads (NSThread): Viszemākais līmenis, kas ļauj manuāli izveidot un pārvaldīt pavedienus:

    • Priekšrocības: Pilnīga kontrole pār pavedienu.
    • Trūkumi: Sarežģītība, nepieciešama manuāla pavediena dzīves cikla pārvaldība, sinhronizācija un izvairīšanās no sacensību stāvokļiem. Parasti tas netiek ieteikts mūsdienu iOS izstrādē.

    Piemērs:

    // Izveidot un palaist pavedienu
    let myThread = Thread {
        // Kods, kas tiek izpildīts jaunajā pavedienā
        print("Veic jauna pavediena ar NSThread")
    }
    myThread.start()
    

Priekšrocības darbā ārpus galvenā pavediena:

  • UI atsaucība: Lietotāja saskarne paliek gluda un atsaucīga, jo galvenais pavedienu netraucē.
  • Veiktspēja: Paralēla uzdevumu izpilde var paātrināt kopējo lietojumprogrammas veiktspēju, izmantojot daudzkodolu procesorus.
  • UX uzlabošana: Lietotājs neredz "apstājies" lietotni ilgstošu operāciju laikā.

Svarīgi punkti:

  • UI atjaunināšana: Jebkurš lietotāja saskarnes elementu atjauninājums veic tikai galvenajā (UI) pavedienā. Mēģinājums atjaunināt UI no fonā esoša pavediena var novest pie neparedzama uzvedības vai lietotnes avārijas.
  • Sinhronizācija: Darbā ar kopīgiem resursiem (mainīgajiem, objektiem) vairākos pavedienos ir nepieciešams izmantot sinhronizācijas mehānismus (semafori, bloķēšanas, barjeru rindas), lai izvairītos no sacensību stāvokļiem.
  • Atcelšana: Ilgstošām fonā esošām uzdevumiem ir svarīgi nodrošināt to atcelšanas iespēju, piemēram, ja lietotājs aiziet no ekrāna. Operation Queues nodrošina iebūvētu atcelšanas mehānismu. GCD tas var būt sarežģītāk realizējams.

Izvēle starp GCD un Operation Queues ir atkarīga no uzdevuma specifikas. Vienkāršām fonu operācijām bieži pietiek ar GCD. Sarežģītākiem scenārijiem ar atkarībām vai nepieciešamību atcelt, ir labāk izmantot Operation Queues. NSThread mūsdienu izstrādē tiek izmantots reti.