Sobes.tech
Middle

რა არის მუშაობა სხვა ნაკადებთან, გარდა ძირითადი (off main thread)?

sobes.tech AI

პასუხი AI-სგან

Աշխատանքը հոսքերի հետ, որոնք տարբերվում են հիմնականից, ենթադրում է ռեսուրսային կամ երկարատև գործողությունների (օրինակ՝ ցանցային հարցումներ, տվյալների մշակում, տվյալների բազայի հետ աշխատանք) կատարմամբ ֆոնային ռեժիմում, որպեսզի չխոչընդոտվի հիմնական հոսքը (UI Thread): Դա կարևոր է օգտագործողի ինտերֆեյսի արձագանքման պահպանման համար:

ԻՕՍ-ում դա առավել հաճախ օգտագործվում է.

  1. Grand Central Dispatch (GCD): Բարձր արդյունավետությամբ տեխնոլոգիա հոսքերի համաժամանակյա և մրցակցային կատարման համար:

    • Առավելություններ: Օգտագործման պարզություն, ավտոմատ հոսքերի պուլերի կառավարում, արտադրողականության օպտիմիզացիա:
    • Կոմպրոմիսներ: Օպերացիաների չեղարկման դժվարություններ, ավելի քիչ ճկունություն օպերացիաների կյանքի ցիկլի կառավարման մեջ՝ համեմատած Operation Queues:

    GCD օգտագործման օրինակ՝ ֆոնային առաջադրանքի համար:

    // Գլոբալ հերթում առաջադրանքի կատարմամբ (ֆոնային հոսք)
    DispatchQueue.global(qos: .userInitiated).async {
        // Ձեր կոդը, որը կատարում է երկարատև գործողություն
        print("Ֆոնային հոսքում աշխատանք")
    
        // Ապա, եթե անհրաժեշտ է UI-ն թարմացնել, վերադառնալ հիմնական հոսք
        DispatchQueue.main.async {
            // UI-ի թարմացում
            print("Հիմնական հոսքում UI թարմացում")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): Օբյեկտային օղակով պատված GCD-ի վրա, որը թույլ է տալիս ավելի ճկուն կառավարում:

    • Առավելություններ: Օպերացիաների միջև կախվածությունները կառավարել, չեղարկելու հնարավորությունը, կրկնակի օգտագործում և պաուզա:
    • Կոմպրոմիսներ: Փոքր-ինչ ավելի բարդ սինտաքսիս՝ համեմատ GCD-ի:

    Օրինակ՝ OperationQueue-ի օգտագործում:

    // Օպերացիաների հերթի ստեղծում
    let operationQueue = OperationQueue()
    
    // Օպերացիայի ստեղծում (կարող եք օգտագործել BlockOperation կամ ձեր դասը, որը ժառանգում է Operation-ից)
    let myOperation = BlockOperation {
        // Ձեր կոդը, որը կատարում է երկարատև գործողություն
        print("Ֆոնային օպերացիայում աշխատանք")
    }
    
    // Օպերացիայի ավելացում հերթին
    operationQueue.addOperation(myOperation)
    
  3. Manual Threads (NSThread): Ամենացածր մակարդակը, որը թույլ է տալիս ձեռքով ստեղծել և կառավարել հոսքերը:

    • Առավելություններ: Լրիվ վերահսկողություն հոսքի վրա:
    • Կոմպրոմիսներ: Բարդություն, անհրաժեշտ է ձեռքով կառավարել հոսքի կյանքի ցիկլը, սինխրոնդաշտում և ռիսկերից խուսափում՝ ռասսի պայմաններից:

    Օրինակ՝ NSThread-ի օգտագործում (շատ հազվադեպ):

    // Հոսքի ստեղծում և մեկնարկ
    let myThread = Thread {
        // Կոդ, որը կատարվում է նոր հոսքում
        print("Նոր հոսքում NSThread-ի միջոցով աշխատանք")
    }
    myThread.start()
    

Նախագծում off main thread-ի առավելությունները:

  • UI-ի պատասխանատվություն: UI-ն մնում է հարթ և պատասխանատու, քանի որ հիմնական հոսքը չի բլոկավորվում:
  • Արդյունավետություն: Փոխհատուցվող և համաժամանակյա կատարման միջոցով կարող է արագացնել ծրագրի ընդհանուր կատարողականությունը՝ օգտագործելով բազմակորուսային պրոցեսորներ:
  • UX-ի բարելավում: Օգտագործողը չի տեսնում "կայծող" հավելվածը երկարատև գործողությունների ժամանակ:

Կարևոր կետեր:

  • UI թարմացում: Յուրաքանչյուր UI տարրերի թարմացումը պետք է կատարվի միայն հիմնական (UI) հոսքում։ Փորձը UI-ն ֆոնային հոսքից թարմացնելը կարող է հանգեցնել անպատասխան վարքագծի կամ հավելվածի կոտրվելու:
  • Սինխրոնիզացիա: Երբ աշխատում եք ընդհանուր ռեսուրսների (փոփոխականներ, օբյեկտներ) հետ մի քանի հոսքերում, անհրաժեշտ է օգտագործել սինխրոնիզացիայի մեխանիզմներ (սեմաֆորներ, բլոկավորումներ, բարիերային հերթեր), որպեսզի կանխել ռասսի պայմանները:
  • Չեղարկում: Երկարատև ֆոնային առաջադրանքների դեպքում կարևոր է ապահովել դրանց չեղարկման հնարավորությունը, օրինակ՝ եթե օգտվողը հեռանում է էկրանից։ Operation Queues-ն ապահովում է ներքին չեղարկման մեխանիզմ։ GCD-ում դա կարող է լինել ավելի բարդ:

Ընտրությունը GCD և Operation Queues միջև կախված է առաջադրանքի բնույթից։ Պարզ ֆոնային գործողությունների համար հաճախ բավարար է GCD-ը։ Ավելի բարդ սցենարների համար՝ կախվածությունից կամ չեղարկման անհրաժեշտությունից, ավելի լավ է օգտագործել Operation Queues։ NSThread-ը հազվադեպ է օգտագործվում ժամանակակից ծրագրավորման մեջ։