Sobes.tech
Junior

Ի՞նչ է աշխատանքը այն թելերով, որոնք տարբերվում են հիմնական (main thread)-ից։

sobes.tech AI

Պատասխան AI-ից

Աշխատանքը հոսքերի հետ, որոնք տարբերվում են հիմնական (main thread)-ից, թույլ է տալիս iOS-ում կատարել ասինխրոնային առաջադրանքներ՝ չխոչընդոտելով գլխավոր UI հոսքը։ Սա կարևոր է ծրագրի արձագանքման կարողությունը պահպանելու համար, հատկապես երկարատև գործողությունների ժամանակ, ինչպիսիք են ցանցային հարցումները, տվյալների մշակումը կամ ֆայլերի հետ աշխատանքը։

Հիմնական մեխանիզմները ֆոնային հոսքերի հետ աշխատելու համար են՝

  1. GCD (Grand Central Dispatch):

    • Ներքևի մակարդակի C-կատեգորիայի գրադարան։
    • Օգտագործում է առաջադրանքների հերթեր (DispatchQueue
    • Կարող է ստեղծել համաժամանակյա և հաջորդական հերթեր։
    • Աշխատում է գլոբալ հերթերով (համաժամանակյա) և գլխավոր հոսքով (main
    • Հեշտ է օգտագործել ֆոնային ռեժիմում կոդի բլոկներ կատարելու համար։
    // Կոդի կատարում գլոբալ հերթում
    DispatchQueue.global(qos: .userInitiated).async {
        // Երկարատև առաջադրանք
        print("Առաջադրանքը կատարվել է ֆոնային հոսքում")
    
        // Վերադարձ գլխավոր հոսք UI թարմացման համար
        DispatchQueue.main.async {
            // UI թարմացում
            print("UI թարմացվել է գլխավոր հոսքում")
        }
    }
    
  2. Operation Queues (Operation և OperationQueue):

    • Ավելի բարձր մակարդակի աբստրակցիա, հիմնված GCD-ի վրա։
    • Առաջադրանքները ներկայացնում է որպես Operation օբյեկտներ։
    • Հնարավորություն է կառավարել կախվածությունները, դադարեցնել, չեղարկել և վերականգնել առաջադրանքները։
    • Ավելի հարմար է բարդ առաջադրանքների շղթաներ կառավարելու համար։
    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if self.isCancelled { return }
            // Երկարատև առաջադրանք
            print("Operation կատարվել է ֆոնային հոսքում")
    
            if self.isCancelled { return }
            // Վերադարձ գլխավոր հոսք UI թարմացման համար
            OperationQueue.main.addOperation {
                 print("UI թարմացվել է Operation-ից")
            }
        }
    }
    
    // Օպերացիաների հերթի ստեղծում
    let queue = OperationQueue()
    queue.qualityOfService = .userInitiated
    
    // Օպերացիաների ավելացում
    queue.addOperation(MyOperation())
    
  3. Async/Await (Concurrency):

    • Մոդեռն մեխանիզմ՝ асинхронային ծրագրավորման համար Swift-ում։
    • Օգտագործում է async և await բանալի բառերը՝ асинхронային ֆունկցիաները նշելու և դրանց ավարտը սպասելու համար։
    • Պարզեցնում է асинхронային կոդի գրառումը և ընթերցումը՝ խուսափելով "callback hell"-ից։
    • Ավտոմատ կերպով կառավարում է հոսքերի անցումը։
    func fetchData() async -> Data? {
        // Ցանցային հարցման իմիտացիա
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("Տվյալները ստացվել են асинхронային ֆունկցիայից")
        return Data()
    }
    
    // Async ֆունկցիայի կանչում Task-ից
    Task {
        if let data = await fetchData() {
            print("Ստացված տվյալների չափը՝ \(data.count)")
            // Ավտոմատ կերպով կատարվում է համապատասխան կոնտեքստում (կարող է լինել main՝ UI թարմացման համար)
        }
    }
    

Հիմնական ասպեկտներ:

  • Հոսքերի անվտանգություն (Thread Safety): Պետք է զգույշ լինել ընդհանուր ռեսուրսների (փոփոխականների, օբյեկտների) մուտքի ժամանակ՝ տարբեր հոսքերից, որպեսզի խուսափել տվյալների մրցակցությունից։ Դրա համար օգտագործվում են սեղմումներ (locks), հերթեր (համապատասխան մուտքի սերիալիզացման համար) կամ ատոմային օպերացիաներ։
  • UI-ի թարմացում: Միշտ կատարեք UI տարրերի թարմացումները միայն գլխավոր հոսքում (DispatchQueue.main կամ OperationQueue.main)։ Փորձը UI-ի թարմացմանից ֆոնային հոսքից կհանգեցնի սխալների կամ անպատճառ վարքագծի։
  • Օպտիմիզացիա: Ընտրեք ճիշտ մեխանիզմը՝ առաջադրանքի տեսակից կախված։ GCD-ը հեշտ է օգտագործել պարզ асинхронային բլոկների համար, Operation Queues-ը՝ բարդ շղթաների կառավարման համար, Async/Await-ը՝ ժամանակակից կառուցվածքային асинхронային կոդի համար։
  • Առաջնահերթություններ (QoS): նշեք ծառայության որակը՝ Tasks-ի համար, որպեսզի համակարգը կարողանա ճիշտ կառավարել նրանց առաջնահերթությունները և բաժանել ռեսուրսները։
Մեխանիզմ Աբստրակցիայի մակարդակ Վաբասությունների կառավարում Չեղարկում/պաուզա Օգտագործման հեշտություն
GCD Ներքևի Չկա (միայն հիմնական) Կարծես դժվարին Միջին
Operation Queues Բարձր Այո Հեշտ Միջին/Բարձր
Async/Await Բարձր Կես-վերածնված Հեշտ (Task) Բարձր

Սխալ օգտագործումը ֆոնային հոսքերի կարևոր է արդյունավետ և արձագանքող iOS հավելվածներ ստեղծելու համար։