Sobes.tech
Junior

Šta je rad sa nitima koje se razlikuju od glavne (main thread)?

sobes.tech АИ

Одговор од АИ

Rad sa tokovima, različitim od glavnog (main thread), u iOS omogućava izvršavanje asinhronih zadataka, ne blokirajući glavni tok UI-ja. Ovo je ključno za očuvanje odzivnosti aplikacije, posebno pri izvođenju dugotrajnih operacija kao što su mrežni zahtevi, obrada podataka ili rad sa fajlovima.

Glavni mehanizmi za rad sa pozadinskim tokovima su:

  1. GCD (Grand Central Dispatch):

    • Niskonivojska biblioteka za C.
    • Koristi redove zadataka (DispatchQueue).
    • Može da kreira paralelne i sekvencijalne redove.
    • Omogućava rad sa globalnim redovima (concurrent) i redom glavnog toka (main).
    • Jednostavan za korišćenje za izvršavanje blokova koda u pozadini.
    // Izvršavanje koda u globalnom redu
    DispatchQueue.global(qos: .userInitiated).async {
        // Dugotrajna operacija
        print("Zadatak je izvršen u pozadinskom toku")
    
        // Povratak na glavni tok za ažuriranje UI
        DispatchQueue.main.async {
            // Ažuriranje UI
            print("UI je ažuriran u glavnom toku")
        }
    }
    
  2. Operation Queues (Operation i OperationQueue):

    • Viši nivo apstrakcije, zasnovan na GCD.
    • Predstavlja zadatke kao objekte Operation.
    • Omogućava upravljanje zavisnostima između operacija, pauziranje, otkazivanje i nastavak.
    • Pogodniji za upravljanje složenim nizovima zadataka.
    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if self.isCancelled { return }
            // Dugotrajna operacija
            print("Operation je izvršen u pozadinskom toku")
    
            if self.isCancelled { return }
            // Povratak na glavni tok za ažuriranje UI
            OperationQueue.main.addOperation {
                 print("UI je ažuriran iz Operation")
            }
        }
    }
    
    // Kreiranje reda operacija
    let queue = OperationQueue()
    queue.qualityOfService = .userInitiated
    
    // Dodavanje operacija u red
    queue.addOperation(MyOperation())
    
  3. Async/Await (Concurrency):

    • Moderni mehanizam za asinhrono programiranje u Swift-u.
    • Koristi ključne reči async za označavanje asinhronih funkcija i await za čekanje njihovog završetka.
    • Olakšava pisanje i čitanje asinhronog koda, izbegavajući "callback hell".
    • Automatski upravlja prebacivanjem između tokova.
    func fetchData() async -> Data? {
        // Simulacija mrežnog zahteva
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("Podaci su dobijeni u asinhronoj funkciji")
        return Data()
    }
    
    // Pozivanje asinhrone funkcije iz Task
    Task {
        if let data = await fetchData() {
            print("Primljeni podaci veličine: \(data.count)")
            // Automatski se izvršava u odgovarajućem kontekstu (može biti main za ažuriranje UI)
        }
    }
    

Važni aspekti:

  • Sigurnost sa tokovima (Thread Safety): Potrebno je biti oprezan pri pristupu zajedničkim resursima (promenljivima, objektima) iz različitih tokova, kako bi se izbegle trke podataka. Za to se koriste blokade (locks), redovi (za serijalizaciju pristupa) ili atomarne operacije.
  • Ažuriranje UI: Uvek vršite ažuriranje elemenata korisničkog interfejsa samo u glavnom toku (DispatchQueue.main ili OperationQueue.main). Pokušaj ažuriranja UI iz pozadinskog toka će dovesti do grešaka ili nepredvidivog ponašanja.
  • Optimizacija: Birajte pravi mehanizam u zavisnosti od zadatka. GCD je jednostavniji za jednostavne asinhrone blokove, Operation Queues — za upravljanje složenim nizovima zadataka, Async/Await — za savremeni strukturirani asinhroni kod.
  • Prioriteti (QoS): Navedite kvalitet usluge (Quality of Service) za zadatke, kako bi sistem mogao pravilno da upravlja njihovim prioritetima i raspoređivanjem resursa.
Mehanizam Nivo apstrakcije Upravljanje zavisnostima Otkazivanje/Pauza Jednostavnost korišćenja
GCD Nizak Bez (osnovno) Teško Srednje
Operation Queues Visok Da Lako Srednje/Visoko
Async/Await Visok Delimično ugrađeno Lako (Task) Visoko

Ispravno korišćenje pozadinskih tokova je ključno za kreiranje efikasnih i odzivnih iOS aplikacija.